diff --git a/common/inc/tx_api.h b/common/inc/tx_api.h index 4ca000be..75b443d2 100644 --- a/common/inc/tx_api.h +++ b/common/inc/tx_api.h @@ -26,7 +26,7 @@ /* APPLICATION INTERFACE DEFINITION RELEASE */ /* */ /* tx_api.h PORTABLE C */ -/* 6.0 */ +/* 6.0.1 */ /* AUTHOR */ /* */ /* William E. Lamie, Microsoft Corporation */ @@ -44,6 +44,9 @@ /* DATE NAME DESCRIPTION */ /* */ /* 05-19-2020 William E. Lamie Initial Version 6.0 */ +/* 06-30-2020 William E. Lamie Modified comment(s), and */ +/* updated product constants, */ +/* resulting in version 6.0.1 */ /* */ /**************************************************************************/ @@ -73,10 +76,13 @@ extern "C" { /* Define the major/minor version information that can be used by the application and the ThreadX source as well. */ -#define EL_PRODUCT_THREADX +#define AZURE_RTOS_THREADX #define THREADX_MAJOR_VERSION 6 #define THREADX_MINOR_VERSION 0 +#define THREADX_PATCH_VERSION 1 +/* Define the following symbol for backward compatibility */ +#define EL_PRODUCT_THREADX /* API input parameters and general constants. */ diff --git a/ports/arc_em/metaware/example_build/.metadata/.lock b/ports/arc_em/metaware/example_build/.metadata/.lock new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_em/metaware/example_build/.metadata/.log b/ports/arc_em/metaware/example_build/.metadata/.log new file mode 100644 index 00000000..9119491b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.log @@ -0,0 +1,937 @@ +!SESSION 2016-01-19 10:53:52.024 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.cdt.core 1 0 2016-01-19 10:55:02.458 +!MESSAGE Indexed 'tx' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.cdt.core 1 0 2016-01-19 10:58:16.298 +!MESSAGE Indexed 'sample_threadx' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2016-01-19 10:59:20.668 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt". +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.access$0(OpenWorkspaceAction.java:274) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$WorkspaceMRUAction.run(OpenWorkspaceAction.java:103) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more + +!ENTRY org.eclipse.e4.ui.workbench 4 0 2016-01-19 10:59:20.678 +!MESSAGE Exception occurred while unrendering: org.eclipse.e4.ui.model.application.ui.basic.impl.TrimmedWindowImpl@4d7f76 (elementId: IDEWindow, tags: [topLevel], contributorURI: platform:/plugin/org.eclipse.ui.workbench) (widget: null, renderer: null, toBeRendered: true, onTop: false, visible: true, containerData: null, accessibilityPhrase: null) (label: %trimmedwindow.label.eclipseSDK, iconURI: null, tooltip: null, context: null, variables: [], x: 250, y: 250, width: 1024, height: 768) +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.access$0(OpenWorkspaceAction.java:274) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$WorkspaceMRUAction.run(OpenWorkspaceAction.java:103) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more +!SESSION 2020-06-17 14:55:11.959 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 14:55:28.047 +!MESSAGE Could not run processor +!STACK 0 +org.eclipse.e4.core.di.InjectionException: java.lang.NullPointerException + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:259) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:107) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessor(ModelAssembler.java:335) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessors(ModelAssembler.java:297) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.processModel(ModelAssembler.java:98) + at org.eclipse.e4.ui.internal.workbench.ResourceHandler.loadMostRecentModel(ResourceHandler.java:197) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.loadApplicationModel(E4Application.java:377) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:252) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:632) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.NullPointerException + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectLaunchBar(LaunchBarInjector.java:109) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectIntoAll(LaunchBarInjector.java:84) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.execute(LaunchBarInjector.java:46) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 26 more + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 14:55:34.531 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 14:55:34.556 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:55:34.558 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:55:34.558 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 14:55:34.575 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:55:34.576 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 14:55:34.888 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. +!SESSION 2020-06-17 14:57:04.375 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.core.resources 4 567 2020-06-17 14:57:08.841 +!MESSAGE Workspace restored, but some problems occurred. +!SUBENTRY 1 org.eclipse.core.resources 4 567 2020-06-17 14:57:08.841 +!MESSAGE Could not read metadata for 'demo_threadx'. +!STACK 1 +org.eclipse.core.internal.resources.ResourceException: The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + at org.eclipse.core.internal.localstore.FileSystemResourceManager.read(FileSystemResourceManager.java:907) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:904) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:884) + at org.eclipse.core.internal.resources.SaveManager.restore(SaveManager.java:735) + at org.eclipse.core.internal.resources.SaveManager.startup(SaveManager.java:1587) + at org.eclipse.core.internal.resources.Workspace.startup(Workspace.java:2399) + at org.eclipse.core.internal.resources.Workspace.open(Workspace.java:2156) + at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:464) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:36) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:419) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +!SUBENTRY 2 org.eclipse.core.resources 4 567 2020-06-17 14:57:08.842 +!MESSAGE The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 14:57:12.158 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 14:57:12.190 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:57:12.191 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:57:12.191 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 14:57:12.213 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 14:57:12.214 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 14:57:12.604 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. + +!ENTRY org.eclipse.cdt.core 1 0 2020-06-17 14:57:35.283 +!MESSAGE Indexed 'sample_threadx' (1 sources, 0 headers) in 0.24 sec: 60 declarations; 165 references; 1 unresolved inclusions; 0 syntax errors; 105 unresolved names (32%) diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 00000000..42f9bd76 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -0,0 +1,5 @@ +*** SESSION Jan 19, 2016 10:54:21.49 ------------------------------------------- +*** SESSION Jan 19, 2016 11:01:03.18 ------------------------------------------- +*** SESSION Feb 12, 2016 17:04:55.37 ------------------------------------------- +*** SESSION Jun 17, 2020 14:55:32.91 ------------------------------------------- +*** SESSION Jun 17, 2020 14:57:11.20 ------------------------------------------- diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1453229896288.pdom b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1453229896288.pdom new file mode 100644 index 00000000..b8b101eb Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1453229896288.pdom differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592431055026.pdom b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592431055026.pdom new file mode 100644 index 00000000..067cf79f Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592431055026.pdom differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml new file mode 100644 index 00000000..1e6dfc06 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml @@ -0,0 +1,4699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml new file mode 100644 index 00000000..c4b91cfa --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1453229702368.pdom b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1453229702368.pdom new file mode 100644 index 00000000..15347cce Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1453229702368.pdom differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml new file mode 100644 index 00000000..38f79520 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml @@ -0,0 +1,6159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 00000000..c552249b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+
+
+
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index new file mode 100644 index 00000000..199f7024 Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index new file mode 100644 index 00000000..dbd394f0 Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 00000000..25cb955b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 00000000..bb2b32af Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 00000000..6b2aaa76 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree new file mode 100644 index 00000000..64196976 Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/5.tree differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 00000000..860287ad Binary files /dev/null and b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..aa2411de --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs new file mode 100644 index 00000000..c002721a --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs @@ -0,0 +1,5 @@ +activeConfigDesc=sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default +configDescList=[sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default] +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchMode=debug +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchTarget=org.eclipse.cdt.launchbar.core.target.local +eclipse.preferences.version=1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 00000000..c71aa03b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2em.exeProject.666673635/com.arc.cdt.toolchain.av2em.exeDebugConfig.1217165695=com.arc.cdt.toolchain.arc.archiver.887646463\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.asmDebugExe.502330268\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeDebugConfig.1217165695\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeLinkerDebug.994503969\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeToolChainDebug.687487123\=rebuildState\\\=false\\r\\n\r\nav2em.exe.debug.exeCompilerDebug.670850607\=rebuildState\\\=false\\r\\n\r\n +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2em.exeProject.666673635/com.arc.cdt.toolchain.av2em.exeReleaseConfig.2022621224=com.arc.cdt.toolchain.av2em.asmReleaseExe.714380962\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.archiver.1360196687\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exelinkerRelease.1145338994\=rebuildState\\\=true\\r\\n\r\narc.cdt.toolchain.av2em.exeCompilerRelease.93257878\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.exeReleaseToolChain.1354693166\=rebuildState\\\=true\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2em.libProject.1936758151/com.arc.cdt.toolchain.av2em.libDebugConfig.732975342=av2em.lib.debug.libCompiler.557728458\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libDebugConfig.732975342\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.1782192981\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libDebugToolChain.1845103261\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.ArDebug.448807496\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libDebugAsm.1772833895\=rebuildState\\\=false\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2em.libProject.1936758151/com.arc.cdt.toolchain.av2em.libReleaseConfig.1738957053=com.arc.cdt.toolchain.av2em.libReleaseToolChain.637077717\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.ArRelease.50929117\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libReleaseAsm.1659783437\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.1430136995\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2em.libCompilerRelease.267590455\=rebuildState\\\=true\\r\\n\r\n diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 00000000..5e2da66d --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..dffc6b51 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 00000000..47236716 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,5 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.localCLaunch=org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +eclipse.preferences.version=1 +prefWatchExpressions=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 00000000..45b0d108 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +org.eclipse.debug.ui.user_view_bindings=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=\r\n +pref_state_memento.org.eclipse.debug.ui.ExpressionView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.VariableView=\r\n\r\n\r\n +preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane| +preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 00000000..61f3bb8b --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 00000000..76ce67b9 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,5 @@ +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1590536495337 +quickStart=true +tipsAndTricks=true diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 00000000..08076f23 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 00000000..60e7be60 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,4 @@ +//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false +UIActivities.com.arc.cdt.debug.seecode.ui.activity1=true +UIActivities.org.eclipse.cdt.debug.cdigdbActivity=true +eclipse.preferences.version=1 diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch new file mode 100644 index 00000000..943da6ac --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 00000000..360c49ad --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,11 @@ + +
+
+ + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 00000000..c22cfeb5 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml new file mode 100644 index 00000000..919834a6 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml @@ -0,0 +1,15 @@ + +
+
+ + + + + + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 00000000..2c2508c6 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,1779 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.SearchActionSet + persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.ui.CView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.TaskList + persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard1 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard2 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView + persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet + persp.actionSet:org.eclipse.cdt.ui.OpenActionSet + persp.actionSet:org.eclipse.cdt.ui.CodingActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation + persp.showIn:org.eclipse.cdt.ui.includeBrowser + persp.showIn:org.eclipse.cdt.ui.CView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.cdt.ui.includeBrowser + persp.actionSet:org.eclipse.debug.ui.debugActionSet + + + newtablook + active + + + + + + + + + + newtablook + + + + + + + + newtablook + Debug + + + + + + + + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.viewSC:org.eclipse.debug.ui.DebugView + persp.viewSC:org.eclipse.debug.ui.VariableView + persp.viewSC:org.eclipse.debug.ui.BreakpointView + persp.viewSC:org.eclipse.debug.ui.ExpressionView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.disasm + persp.viewSC:com.arc.cdt.debug.seecode.ui.command + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.memsearch + persp.viewSC:com.arc.cdt.seecode.errorlog + persp.viewSC:org.eclipse.cdt.debug.ui.SignalsView + persp.viewSC:org.eclipse.cdt.debug.ui.RegisterView + persp.viewSC:org.eclipse.debug.ui.ModuleView + persp.viewSC:org.eclipse.debug.ui.MemoryView + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.debug.ui.executablesView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSet + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt + persp.viewSC:org.eclipse.cdt.dsf.gdb.ui.tracecontrol.view + persp.viewSC:org.eclipse.cdt.dsf.debug.ui.disassembly.view + persp.perspSC:org.eclipse.cdt.ui.CPerspective + persp.viewSC:org.eclipse.cdt.visualizer.view + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt2 + + + + + + newtablook + org.eclipse.e4.primaryNavigationStack + + + + + newtablook + + + + + newtablook + + + + + + + + + + + + + + + + + + newtablook + + + + + + newtablook + org.eclipse.e4.secondaryNavigationStack + + + + + + + + + Standalone + + + + + + + newtablook + org.eclipse.e4.secondaryDataStack + + + + + + + + + + newtablook + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Help + + + + newtablook + org.eclipse.e4.primaryDataStack + EditorStack + + + + + View + categoryTag:General + active + activeOnClose + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:&C/C++ + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Make + + + View + categoryTag:Terminal + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history new file mode 100644 index 00000000..023aad6a --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index new file mode 100644 index 00000000..b1d64d87 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index @@ -0,0 +1 @@ +1592431039575 Delete resource 'demo_threadx' diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 00000000..aa267842 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+ + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 00000000..50f1edb3 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 00000000..dba32153 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,14 @@ + +
+
+ + + + + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 00000000..6c7a5b44 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,29 @@ + +
+
+ + + + + + + + + + +
+
+ + + + +
+
+ + + + + + +
+
diff --git a/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 00000000..1ad3c528 --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_em/metaware/example_build/.metadata/version.ini b/ports/arc_em/metaware/example_build/.metadata/version.ini new file mode 100644 index 00000000..824cbfda --- /dev/null +++ b/ports/arc_em/metaware/example_build/.metadata/version.ini @@ -0,0 +1,3 @@ +#Wed Jun 17 14:57:08 PDT 2020 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.6.3.v20170301-0400 diff --git a/ports/arc_em/metaware/example_build/sample_threadx/.cproject b/ports/arc_em/metaware/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..e14337b5 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/.cproject @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/sample_threadx/.project b/ports/arc_em/metaware/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml b/ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..02e19444 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..24d05100 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,368 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); + + return(0); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd new file mode 100644 index 00000000..aced0777 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/sample_threadx.cmd @@ -0,0 +1,56 @@ +// +// This is the linker script example (SRV3-style). +// (c) Synopsys, 2013 +// +// + +//number of exceptions and interrupts +NUMBER_OF_EXCEPTIONS = 16;//it is fixed (16) +NUMBER_OF_INTERRUPTS = 5;//depends on HW configuration + +//define Interrupt Vector Table size +IVT_SIZE_ITEMS = (NUMBER_OF_EXCEPTIONS + NUMBER_OF_INTERRUPTS);//the total IVT size (in "items") +IVT_SIZE_BYTES = IVT_SIZE_ITEMS * 4;//in bytes + +//define ICCM and DCCM locations +MEMORY { + + ICCM: ORIGIN = 0x00000000, LENGTH = 128K + DCCM: ORIGIN = 0x80000000, LENGTH = 128K +} + +//define sections and groups +SECTIONS { + GROUP: { + .ivt (TEXT) : # Interrupt table + { + ___ivt1 = .; + * (.ivt) + ___ivt2 = .; + // Make the IVT at least IVT_SIZE_BYTES + . += (___ivt2 - ___ivt1 < IVT_SIZE_BYTES) ? (IVT_SIZE_BYTES - (___ivt2 - ___ivt1)) : 0; + } + .ivh (TEXT) : // Interrupt handlers + + //TEXT sections + .text? : { *('.text$crt*') } + * (TEXT): {} + //Literals + * (LIT): {} + } > ICCM + + GROUP: { + //data sections + .sdata?: {} + .sbss?: {} + *(DATA): {} + *(BSS): {} + //stack + .stack_top: {} + .stack ALIGN(4) SIZE(DEFINED _STACKSIZE?_STACKSIZE:4096): {} + .stack_base: {} + //heap (empty) + .heap? ALIGN(4) SIZE(DEFINED _HEAPSIZE?_HEAPSIZE:0): {} + .free_memory: {} + } > DCCM + } diff --git a/ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s b/ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s new file mode 100644 index 00000000..8b75bf9f --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/tx_initialize_low_level.s @@ -0,0 +1,360 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; + .equ IRQ_SELECT, 0x40B + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +; +; /* Define section for placement after all linker allocated RAM memory. This +; is used to calculate the first free address that is passed to +; tx_appication_define, soley for the ThreadX application's use. */ +; + .section ".free_memory","aw" + .align 4 + .global _tx_first_free_address +_tx_first_free_address: + .space 4 +; +; /* Define section for placement before the main stack area for setting +; up the STACK_TOP address for hardware stack checking. */ +; + .section ".stack_top","aw" + .align 4 + .global _tx_system_stack_top_address +_tx_system_stack_top_address: + .space 4 +; +; /* Define section for placement after the main stack area for setting +; up the STACK_BASE address for hardware stack checking. */ +; + .section ".stack_base","aw" + .align 4 + .global _tx_system_stack_base_address +_tx_system_stack_base_address: + .space 4 +; +; + .text +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + + .ifdef TX_ENABLE_HW_STACK_CHECKING + mov r0, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r0, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r0, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r0, [KSTACK_BASE] ; Setup KSTACK_BASE + lr r0, [status32] ; Pickup current STATUS32 + or r0, r0, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r0 ; Enable hardware stack checking + .endif +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + st sp, [gp, _tx_thread_system_stack_ptr@sda] ; Save system stack pointer +; +; +; /* Pickup the first available memory address. */ +; + mov r0, _tx_first_free_address ; Pickup first free memory address +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) _end; +; + st r0, [gp, _tx_initialize_unused_memory@sda] +; +; +; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */ +; + mov r0, 0 ; Disable additional ISR reg saving/restoring + sr r0, [AUX_IRQ_CTRL] ; + + mov r0, 16 ; Select timer 0 + sr r0, [IRQ_SELECT] ; + mov r0, 15 ; Set timer 0 to priority 15 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10000 ; Setup timer period + sr r0, [LIMIT0] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT0] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL0] ; + + .ifdef TX_TIMER_1_SETUP + mov r0, 17 ; Select timer 1 + sr r0, [IRQ_SELECT] ; + mov r0, 2 ; Set timer 1 to priority 14 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10020 ; Setup timer period + sr r0, [LIMIT1] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT1] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL1] ; + .endif +; +; /* Done, return to caller. */ +; + j_s.d [blink] ; Return to caller + nop +;} +; +; +; /* Define default vector table entries. */ +; + .global _tx_memory_error +_tx_memory_error: + flag 1 + nop + nop + nop + b _tx_memory_error + + .global _tx_instruction_error +_tx_instruction_error: + flag 1 + nop + nop + nop + b _tx_instruction_error + + .global _tx_ev_machine_check +_tx_ev_machine_check: + flag 1 + nop + nop + nop + b _tx_ev_machine_check + + .global _tx_ev_tblmiss_inst +_tx_ev_tblmiss_inst: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_inst + + .global _tx_ev_tblmiss_data +_tx_ev_tblmiss_data: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_data + + .global _tx_ev_protection_viol +_tx_ev_protection_viol: + flag 1 + nop + nop + nop + b _tx_ev_protection_viol + + .global _tx_ev_privilege_viol +_tx_ev_privilege_viol: + flag 1 + nop + nop + nop + b _tx_ev_privilege_viol + + .global _tx_ev_software_int +_tx_ev_software_int: + flag 1 + nop + nop + nop + b _tx_ev_software_int + + .global _tx_ev_trap +_tx_ev_trap: + flag 1 + nop + nop + nop + b _tx_ev_trap + + .global _tx_ev_extension +_tx_ev_extension: + flag 1 + nop + nop + nop + b _tx_ev_extension + + .global _tx_ev_divide_by_zero +_tx_ev_divide_by_zero: + flag 1 + nop + nop + nop + b _tx_ev_divide_by_zero + + .global _tx_ev_dc_error +_tx_ev_dc_error: + flag 1 + nop + nop + nop + b _tx_ev_dc_error + + .global _tx_ev_maligned +_tx_ev_maligned: + flag 1 + nop + nop + nop + b _tx_ev_maligned + + .global _tx_unsued_0 +_tx_unsued_0: + flag 1 + nop + nop + nop + b _tx_unsued_0 + + .global _tx_unused_1 +_tx_unused_1: + flag 1 + nop + nop + nop + b _tx_unused_1 + + .global _tx_timer_0 +_tx_timer_0: +; +; /* By default, setup Timer 0 as the ThreadX timer interrupt. */ +; + sub sp, sp, 160 ; Allocate an interrupt stack frame + st r0, [sp, 0] ; Save r0 + st r1, [sp, 4] ; Save r1 + st r2, [sp, 8] ; Save r2 + mov r0, 3 + sr r0, [CONTROL0] + + b _tx_timer_interrupt ; Jump to generic ThreadX timer interrupt + ; handler +; flag 1 +; nop +; nop +; nop +; b _tx_timer_0 + + .global _tx_timer_1 +_tx_timer_1: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Call context save +; +; /* ISR processing goes here. If the applications wishes to re-enable +; interrupts, the SETI instruction can be used here. Also note that +; register usage in assembly code must be confined to the compiler +; scratch registers. */ +; + mov r0, 3 + sr r0, [CONTROL1] +; + b _tx_thread_context_restore ; Call context restore + +; flag 1 +; nop +; nop +; nop +; b _tx_timer_1 + + .global _tx_undefined_0 +_tx_undefined_0: + flag 1 + nop + nop + nop + b _tx_undefined_0 + + .global _tx_undefined_1 +_tx_undefined_1: + flag 1 + nop + nop + nop + b _tx_undefined_1 + + .global _tx_undefined_2 +_tx_undefined_2: + flag 1 + nop + nop + nop + b _tx_undefined_2 + + .end diff --git a/ports/arc_em/metaware/example_build/sample_threadx/vectors.s b/ports/arc_em/metaware/example_build/sample_threadx/vectors.s new file mode 100644 index 00000000..c6cbc893 --- /dev/null +++ b/ports/arc_em/metaware/example_build/sample_threadx/vectors.s @@ -0,0 +1,29 @@ + +.file "vectors.s" +.section .ivt,text +;; This directive forces this section to stay resident even if stripped out by the -zpurgetext linker option +.sectflag .ivt,include + +;// handler's name type number name offset in IVT (hex/dec) +.long _start ; exception 0 program entry point offset 0x0 0 +.long _tx_memory_error ; exception 1 memory_error offset 0x4 4 +.long _tx_instruction_error ; exception 2 instruction_error offset 0x8 8 +.long _tx_ev_machine_check ; exception 3 EV_MachineCheck offset 0xC 12 +.long _tx_ev_tblmiss_inst ; exception 4 EV_TLBMissI offset 0x10 16 +.long _tx_ev_tblmiss_data ; exception 5 EV_TLBMissD offset 0x14 20 +.long _tx_ev_protection_viol ; exception 6 EV_ProtV offset 0x18 24 +.long _tx_ev_privilege_viol ; exception 7 EV_PrivilegeV offset 0x1C 28 +.long _tx_ev_software_int ; exception 8 EV_SWI offset 0x20 32 +.long _tx_ev_trap ; exception 9 EV_Trap offset 0x24 36 +.long _tx_ev_extension ; exception 10 EV_Extension offset 0x28 40 +.long _tx_ev_divide_by_zero ; exception 11 EV_DivZero offset 0x2C 44 +.long _tx_ev_dc_error ; exception 12 EV_DCError offset 0x30 48 +.long _tx_ev_maligned ; exception 13 EV_Maligned offset 0x34 52 +.long _tx_unsued_0 ; exception 14 unused offset 0x38 56 +.long _tx_unused_1 ; exception 15 unused offset 0x3C 60 +.long _tx_timer_0 ; IRQ 16 Timer 0 offset 0x40 64 +.long _tx_timer_1 ; IRQ 17 Timer 1 offset 0x44 68 +.long _tx_undefined_0 ; IRQ 18 offset 0x48 72 +.long _tx_undefined_1 ; IRQ 19 offset 0x4C 76 +.long _tx_undefined_2 ; IRQ 20 offset 0x50 80 + diff --git a/ports/arc_em/metaware/example_build/tx/.cproject b/ports/arc_em/metaware/example_build/tx/.cproject new file mode 100644 index 00000000..ce329051 --- /dev/null +++ b/ports/arc_em/metaware/example_build/tx/.cproject @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/example_build/tx/.project b/ports/arc_em/metaware/example_build/tx/.project new file mode 100644 index 00000000..863ca5cb --- /dev/null +++ b/ports/arc_em/metaware/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml b/ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..a0e8c9c5 --- /dev/null +++ b/ports/arc_em/metaware/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_em/metaware/inc/tx_port.h b/ports/arc_em/metaware/inc/tx_port.h new file mode 100644 index 00000000..0a197ab6 --- /dev/null +++ b/ports/arc_em/metaware/inc/tx_port.h @@ -0,0 +1,325 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARCv2_EM/MetaWare */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Remove volatile for ThreadX source on the ARC. This is because the ARC + compiler generates different non-cache r/w access when using volatile + that is different from the assembly language access of the same + global variables in ThreadX. */ + +#ifdef TX_SOURCE_CODE +#define volatile +#else +#ifdef NX_SOURCE_CODE +#define volatile +#else +#ifdef FX_SOURCE_CODE +#define volatile +#else +#ifdef UX_SOURCE_CODE +#define volatile +#endif +#endif +#endif +#endif + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 800 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 2048 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARCv2 EM port. */ + +#define TX_INT_ENABLE 0x0000001F /* Enable all interrupts */ +#define TX_INT_DISABLE_MASK 0x00000000 /* Disable all interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 VOID *__mw_threadx_tls; \ + int __mw_errnum; \ + VOID (*__mw_thread_exit)(struct TX_THREAD_STRUCT *); +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + +#if __HIGHC__ + +/* The MetaWare thread safe C/C++ runtime library needs space to + store thread specific information. In addition, a function pointer + is also supplied so that certain thread-specific resources may be + released upon thread termination and/or thread completion. */ + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) \ + thread_ptr -> __mw_threadx_tls = 0; \ + thread_ptr -> __mw_errnum = 0; \ + thread_ptr -> __mw_thread_exit = TX_NULL; +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); + +#else + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _clri(); +#define TX_RESTORE _seti(interrupt_save); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARCv2_EM/MetaWare Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/arc_em/metaware/readme_threadx.txt b/ports/arc_em/metaware/readme_threadx.txt new file mode 100644 index 00000000..dcba11a8 --- /dev/null +++ b/ports/arc_em/metaware/readme_threadx.txt @@ -0,0 +1,219 @@ + Microsoft's Azure RTOS ThreadX for ARC EM + + Using the MetaWare Tools + +1. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace, which is located inside the "example_build" directory. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply select the ThreadX library project +file "tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the MetaWare ARCv2 EM +simulation. The instructions that follow describe how to get the ThreadX +demonstration running. + +Building the demonstration is easy; simply select the demonstration project file +"sample_threadx." At this point, select the build button and observe the +compilation, assembly, and linkage of the ThreadX demonstration application. + +After the demonstration is built, click on the "Debug" button and it will +automatically launch a pre-configured connection to the ARCv2 EM simulator. + +You are now ready to execute the ThreadX demonstration system. Select +breakpoints and data watches to observe the execution of the sample_threadx.c +application. + + +4. System Initialization + +The system entry point using the MetaWare tools is at the label _start. +This is defined within the crt1.s file supplied by MetaWare. In addition, +this is where all static and global preset C variable initialization +processing is called from. + +After the MetaWare startup function completes, ThreadX initialization is +called. The main initialization function is _tx_initialize_low_level and +is located in the file tx_initialize_low_level.s. This function is +responsible for setting up various system data structures, and interrupt +vectors. + +By default free memory is assumed to start at the section .free_memory +which is referenced in tx_initialize_low_level.s and located in the +linker control file after all the linker defined RAM addresses. This is +the address passed to the application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The ARC compiler assumes that registers r0-r12 are scratch registers for +each function. All other registers used by a C function must be preserved +by the function. ThreadX takes advantage of this in situations where a +context switch happens as a result of making a ThreadX service call (which +is itself a C function). In such cases, the saved context of a thread is +only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 LP_START blink + 0x08 LP_END fp + 0x0C LP_COUNT r26 + 0x10 blink r25 + 0x14 ilink r24 + 0x18 fp r23 + 0x1C r26 r22 + 0x20 r25 r21 + 0x24 r24 r20 + 0x28 r23 r19 + 0x2C r22 r18 + 0x30 r21 r17 + 0x34 r20 r16 + 0x38 r19 r15 + 0x3C r18 r14 + 0x40 r17 r13 + 0x44 r16 STATUS32 + 0x48 r15 r30 + 0x4C r14 + 0x50 r13 + 0x54 r12 + 0x58 r11 + 0x5C r10 + 0x60 r9 + 0x64 r8 + 0x68 r7 + 0x6C r6 + 0x70 r5 + 0x74 r4 + 0x78 r3 + 0x7C r2 + 0x80 r1 + 0x84 r0 + 0x88 r30 + 0x8C r58 (if TX_ENABLE_ACC defined) + 0x90 r59 (if TX_ENABLE_ACC defined) + 0x94 reserved + 0x98 reserved + 0x9C bta + 0xA0 point of interrupt + 0xA4 STATUS32 + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat +file to remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for the +ARCv2 EM processor. The following template should be used for interrupts +managed by ThreadX: + + .global _tx_interrupt_x +_tx_interrupt_x: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink (blink must be saved before _tx_thread_context_save) + bl _tx_thread_context_save ; Save interrupt context +; +; /* Application ISR processing goes here! Your ISR can be written in +; assembly language or in C. If it is written in C, you must allocate +; 16 bytes of stack space before it is called. This must also be +; recovered once your C ISR return. An example of this is shown below. +; +; If the ISR is written in assembly language, only the compiler scratch +; registers are available for use without saving/restoring (r0-r12). +; If use of additional registers are required they must be saved and +; restored. */ +; + bl.d your_ISR_written_in_C ; Call an ISR written in C + sub sp, sp, 16 ; Allocate stack space (delay slot) + add sp, sp, 16 ; Recover stack space + +; + b _tx_thread_context_restore ; Restore interrupt context + + +The application handle interrupts directly, which necessitates all register +preservation by the application's ISR. ISRs that do not use the ThreadX +_tx_thread_context_save and _tx_thread_context_restore routines are not +allowed access to the ThreadX API. In addition, custom application ISRs +should be higher priority than all ThreadX-managed ISRs. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +By default, the ThreadX timer interrupt is mapped to the ARCv2 EM auxiliary +timer 0, which generates low priority interrupts on interrupt vector 16. +It is easy to change the timer interrupt source and priority by changing the +setup code in tx_initialize_low_level.s. + + +9. Hardware Stack Checking + +ThreadX optionally supports the ARCv2 EM hardware stack checking feature. When enabled, +the KSTACK_TOP and KSTACK_BASE registers are loaded with the stack top/bottom before +each thread's execution. In addition, the SC bit of STATUS32 is set to enable the stack +checking feature. During initialization, idle, or interrupt processing, the hardware +stack checking on the system stack is performed, when enabled. + +To enable ThreadX support for hardware stack checking, simply build the ThreadX library +and application assembly code with TX_ENABLE_HW_STACK_CHECKING defined. This will enable +the stack checking logic in ThreadX. + +For the system stack checking to function properly, there are two sections that must +be located around the .stack section, which defines the system stack location and size. +The new sections are .stack_top and .stack_base. The .stack_top section should be placed +immediately BEFORE the .stack section and .stack_base should be placed immediately AFTER +the .stack section. Please see the sample_threadx.cmd linker control file for an example. + +When/if a stack exception occurs, the hardware will fetch the _tx_ev_protection_viol +exception defined in tx_initialize_low_level.s. Processing for this exception is +application specific. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 for ARCv2 EM using MetaWare tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arc_em/metaware/src/tx_initialize_low_level.s b/ports/arc_em/metaware/src/tx_initialize_low_level.s new file mode 100644 index 00000000..8b75bf9f --- /dev/null +++ b/ports/arc_em/metaware/src/tx_initialize_low_level.s @@ -0,0 +1,360 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; + .equ IRQ_SELECT, 0x40B + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +; +; /* Define section for placement after all linker allocated RAM memory. This +; is used to calculate the first free address that is passed to +; tx_appication_define, soley for the ThreadX application's use. */ +; + .section ".free_memory","aw" + .align 4 + .global _tx_first_free_address +_tx_first_free_address: + .space 4 +; +; /* Define section for placement before the main stack area for setting +; up the STACK_TOP address for hardware stack checking. */ +; + .section ".stack_top","aw" + .align 4 + .global _tx_system_stack_top_address +_tx_system_stack_top_address: + .space 4 +; +; /* Define section for placement after the main stack area for setting +; up the STACK_BASE address for hardware stack checking. */ +; + .section ".stack_base","aw" + .align 4 + .global _tx_system_stack_base_address +_tx_system_stack_base_address: + .space 4 +; +; + .text +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + + .ifdef TX_ENABLE_HW_STACK_CHECKING + mov r0, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r0, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r0, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r0, [KSTACK_BASE] ; Setup KSTACK_BASE + lr r0, [status32] ; Pickup current STATUS32 + or r0, r0, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r0 ; Enable hardware stack checking + .endif +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + st sp, [gp, _tx_thread_system_stack_ptr@sda] ; Save system stack pointer +; +; +; /* Pickup the first available memory address. */ +; + mov r0, _tx_first_free_address ; Pickup first free memory address +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) _end; +; + st r0, [gp, _tx_initialize_unused_memory@sda] +; +; +; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */ +; + mov r0, 0 ; Disable additional ISR reg saving/restoring + sr r0, [AUX_IRQ_CTRL] ; + + mov r0, 16 ; Select timer 0 + sr r0, [IRQ_SELECT] ; + mov r0, 15 ; Set timer 0 to priority 15 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10000 ; Setup timer period + sr r0, [LIMIT0] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT0] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL0] ; + + .ifdef TX_TIMER_1_SETUP + mov r0, 17 ; Select timer 1 + sr r0, [IRQ_SELECT] ; + mov r0, 2 ; Set timer 1 to priority 14 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10020 ; Setup timer period + sr r0, [LIMIT1] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT1] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL1] ; + .endif +; +; /* Done, return to caller. */ +; + j_s.d [blink] ; Return to caller + nop +;} +; +; +; /* Define default vector table entries. */ +; + .global _tx_memory_error +_tx_memory_error: + flag 1 + nop + nop + nop + b _tx_memory_error + + .global _tx_instruction_error +_tx_instruction_error: + flag 1 + nop + nop + nop + b _tx_instruction_error + + .global _tx_ev_machine_check +_tx_ev_machine_check: + flag 1 + nop + nop + nop + b _tx_ev_machine_check + + .global _tx_ev_tblmiss_inst +_tx_ev_tblmiss_inst: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_inst + + .global _tx_ev_tblmiss_data +_tx_ev_tblmiss_data: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_data + + .global _tx_ev_protection_viol +_tx_ev_protection_viol: + flag 1 + nop + nop + nop + b _tx_ev_protection_viol + + .global _tx_ev_privilege_viol +_tx_ev_privilege_viol: + flag 1 + nop + nop + nop + b _tx_ev_privilege_viol + + .global _tx_ev_software_int +_tx_ev_software_int: + flag 1 + nop + nop + nop + b _tx_ev_software_int + + .global _tx_ev_trap +_tx_ev_trap: + flag 1 + nop + nop + nop + b _tx_ev_trap + + .global _tx_ev_extension +_tx_ev_extension: + flag 1 + nop + nop + nop + b _tx_ev_extension + + .global _tx_ev_divide_by_zero +_tx_ev_divide_by_zero: + flag 1 + nop + nop + nop + b _tx_ev_divide_by_zero + + .global _tx_ev_dc_error +_tx_ev_dc_error: + flag 1 + nop + nop + nop + b _tx_ev_dc_error + + .global _tx_ev_maligned +_tx_ev_maligned: + flag 1 + nop + nop + nop + b _tx_ev_maligned + + .global _tx_unsued_0 +_tx_unsued_0: + flag 1 + nop + nop + nop + b _tx_unsued_0 + + .global _tx_unused_1 +_tx_unused_1: + flag 1 + nop + nop + nop + b _tx_unused_1 + + .global _tx_timer_0 +_tx_timer_0: +; +; /* By default, setup Timer 0 as the ThreadX timer interrupt. */ +; + sub sp, sp, 160 ; Allocate an interrupt stack frame + st r0, [sp, 0] ; Save r0 + st r1, [sp, 4] ; Save r1 + st r2, [sp, 8] ; Save r2 + mov r0, 3 + sr r0, [CONTROL0] + + b _tx_timer_interrupt ; Jump to generic ThreadX timer interrupt + ; handler +; flag 1 +; nop +; nop +; nop +; b _tx_timer_0 + + .global _tx_timer_1 +_tx_timer_1: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Call context save +; +; /* ISR processing goes here. If the applications wishes to re-enable +; interrupts, the SETI instruction can be used here. Also note that +; register usage in assembly code must be confined to the compiler +; scratch registers. */ +; + mov r0, 3 + sr r0, [CONTROL1] +; + b _tx_thread_context_restore ; Call context restore + +; flag 1 +; nop +; nop +; nop +; b _tx_timer_1 + + .global _tx_undefined_0 +_tx_undefined_0: + flag 1 + nop + nop + nop + b _tx_undefined_0 + + .global _tx_undefined_1 +_tx_undefined_1: + flag 1 + nop + nop + nop + b _tx_undefined_1 + + .global _tx_undefined_2 +_tx_undefined_2: + flag 1 + nop + nop + nop + b _tx_undefined_2 + + .end diff --git a/ports/arc_em/metaware/src/tx_thread_context_restore.s b/ports/arc_em/metaware/src/tx_thread_context_restore.s new file mode 100644 index 00000000..8bc31394 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_context_restore.s @@ -0,0 +1,302 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, @function +_tx_thread_context_restore: +; +; /* Note: it is assumed that the stack pointer is in the same position now as +; it was after the last context save call. */ +; +; /* Lockout interrupts. */ +; + clri ; Disable interrupts + nop ; Delay for interrupts to really be disabled + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + bl.d _tx_execution_isr_exit ; Call the ISR exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state contents + sub r0, r0, 1 ; Decrement the system state + st r0, [gp, _tx_thread_system_state@sda] ; Store the new system state + breq r0, 0, __tx_thread_not_nested_restore ; If zero, not a nested interrupt +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + +__tx_thread_nested_restore: + + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; +; } +__tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + ld r2, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable flag + sub.f 0, r0, 0 ; Set condition codes + beq.d __tx_thread_idle_system_restore ; If NULL, idle system was interrupted + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + brne.d r4, r5, __tx_thread_no_preempt_restore ; If more interrupts, just return to the point of interrupt + ld r4, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + brne r2, 0, __tx_thread_no_preempt_restore ; If set, don't preempt executing thread + brne r0, r4, __tx_thread_preempt_restore ; Not equal, preempt executing thread +; +; +__tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; + +; /* Recover the saved context and return to the point of interrupt. */ +; + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + ld r3, [r0, 12] ; Pickup the top of the thread's stack (lowest address) + sr r3, [KSTACK_TOP] ; Setup KSTACK_TOP + ld r3, [r0, 16] ; Pickup the base of the thread's stack (highest address) + sr r3, [KSTACK_BASE] ; Setup KSTACK_BASE + .endif + + ld sp, [r0, 8] ; Switch back to thread's stack + + .ifdef TX_ENABLE_HW_STACK_CHECKING + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r2 ; Enable hardware stack checking + .endif + + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; } +; else +; { +__tx_thread_preempt_restore: +; + ld r7, [r0, 8] ; Pickup stack pointer + mov r6, 1 ; Build interrupt stack type + st r6, [r7, 0] ; Setup interrupt stack type + st fp, [r7, 24] ; Save fp + st gp, [r7, 28] ; Save gp + st r25, [r7, 32] ; Save r25 + st r24, [r7, 36] ; Save r24 + st r23, [r7, 40] ; Save r23 + st r22, [r7, 44] ; Save r22 + st r21, [r7, 48] ; Save r21 + st r20, [r7, 52] ; Save r20 + st r19, [r7, 56] ; Save r19 + st r18, [r7, 60] ; Save r18 + st r17, [r7, 64] ; Save r17 + st r16, [r7, 68] ; Save r16 + st r15, [r7, 72] ; Save r15 + st r14, [r7, 76] ; Save r14 + st r13, [r7, 80] ; Save r13 + st r30, [r7, 136] ; Save r30 +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup time-slice contents + mov r7, 0 ; Build clear/NULL value + breq r2, 0, __tx_thread_dont_save_ts ; No time-slice, don't need to save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r2, [r0, 24] ; If set, save remaining time-slice + st r7, [gp, _tx_timer_time_slice@sda] ; If set, clear time slice +; +; } +__tx_thread_dont_save_ts: +; +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + st r7, [gp, _tx_thread_current_ptr@sda] ; Set current thread ptr to NULL + + sub sp, sp, 8 ; Allocate a small stack frame on the system stack + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +; } +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; +__tx_thread_idle_system_restore: + + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + sub.f 0, r4, r5 ; Set condition codes + bne __tx_thread_nested_restore ; If more interrupts, just return to the point of interrupt + + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +;} + .end + diff --git a/ports/arc_em/metaware/src/tx_thread_context_save.s b/ports/arc_em/metaware/src/tx_thread_context_save.s new file mode 100644 index 00000000..e60bc856 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_context_save.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + .global _tx_thread_context_save + .type _tx_thread_context_save, @function +_tx_thread_context_save: +; +; /* Upon entry to this routine, it is assumed that an interrupt stack frame +; has already been allocated, and the interrupted blink register is already saved. */ +; + clri ; Disable interrupts + st r1, [sp, 128] ; Save r1 + st r0, [sp, 132] ; Save r0 +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state + st r3, [sp, 120] ; Save r3 + st r2, [sp, 124] ; Save r2 + breq r0, 0, __tx_thread_not_nested_save ; If 0, we are not in a nested + ; condition +; +; /* Nested interrupt condition. */ +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; +__tx_thread_nested_save: ; Label is for special nested interrupt case from idle system save below + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r6 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + +; +; /* Return to the ISR. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; + + j.d [blink] ; Return to Level 1 ISR + st ilink, [sp, 20] ; Save ilink +; +__tx_thread_not_nested_save: +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state + ld r1, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + breq r1, 0, __tx_thread_idle_system_save ; If no thread is running, idle system was + ; interrupted. +; +; /* Save minimal context of interrupted thread. */ +; + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r4 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + st ilink, [sp, 20] ; Save ilink + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; + st sp, [r1, 8] ; Save thread's stack pointer + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + mov r1, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r1, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r1, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r1, [KSTACK_BASE] ; Setup KSTACK_BASE + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + j_s.d [blink] ; Return to calling ISR + kflag r2 ; Enable hardware stack checking + .else +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + j_s.d [blink] ; Return to calling ISR + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + .endif +; +; } +; else +; { +; +__tx_thread_idle_system_save: +; +; /* Interrupt occurred in the scheduling loop. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; +; /* See if we have a special nesting condition. This happens when the higher priority +; interrupt occurs before the nested interrupt logic is valid. */ +; + lr r0, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r1, r0 ; Negate + and r1, r0, r1 ; See if there are any other interrupts present + brne r0, r1, __tx_thread_nested_save ; If more interrupts, go into the nested interrupt save logic +; +; /* Not much to do here, just adjust the stack pointer, and return to +; ISR processing. */ +; + j_s.d [blink] ; Return to ISR + add sp, sp, 160 ; Recover stack space +; +; } +;} + .end diff --git a/ports/arc_em/metaware/src/tx_thread_interrupt_control.s b/ports/arc_em/metaware/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..5bdf3ccb --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_interrupt_control.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, @function +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + clri r1 ; Get current interrupt state +; +; /* Apply the new interrupt posture. */ +; + seti r0 ; Set desired interrupt state + j_s.d [blink] ; Return to caller with delay slot + mov r0, r1 ; Return previous mask value. Return value is TX_INT_DISABLE or TX_INT_ENABLE. +; +;} + .end diff --git a/ports/arc_em/metaware/src/tx_thread_schedule.s b/ports/arc_em/metaware/src/tx_thread_schedule.s new file mode 100644 index 00000000..2a310a16 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_schedule.s @@ -0,0 +1,238 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; + .equ BTA, 0x412 + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + .global _tx_thread_schedule + .type _tx_thread_schedule, @function +_tx_thread_schedule: +; +; /* Enable interrupts. */ +; + mov r0, 0x1F ; Build enable interrupt value + seti r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { +; +__tx_thread_schedule_loop: +; + ld r0, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + breq r0, 0, __tx_thread_schedule_loop ; If NULL, keep looking +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + clri ; Lockout interrupts + nop ; Delay for interrupts to really be disabled +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + st r0, [gp, _tx_thread_current_ptr@sda] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + ld r3, [r0, 4] ; Pickup run counter + ld r4, [r0, 24] ; Pickup time-slice for this thread + add r3, r3, 1 ; Increment run counter + st r3, [r0, 4] ; Store the new run counter + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + ld r3, [r0, 12] ; Pickup the top of the thread's stack (lowest address) + sr r3, [KSTACK_TOP] ; Setup KSTACK_TOP + ld r3, [r0, 16] ; Pickup the base of the thread's stack (highest address) + sr r3, [KSTACK_BASE] ; Setup KSTACK_BASE + .endif +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + ld sp, [r0, 8] ; Switch to thread's stack + + .ifdef TX_ENABLE_HW_STACK_CHECKING + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r2 ; Enable hardware stack checking + .endif + + st r4, [gp, _tx_timer_time_slice@sda] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + bl.d _tx_execution_thread_enter ; Call the thread execution enter function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + ld r1, [sp, 0] ; Pickup the stack type + brne r1, 0, __tx_thread_schedule_int_ret ; Compare to solicited stack type. If not, thread was interrupted + ld blink, [sp, 4] ; Recover blink + ld fp, [sp, 8] ; Recover fp + ld gp, [sp, 12] ; Recover gp + ld r25, [sp, 16] ; Recover r25 + ld r24, [sp, 20] ; Recover r24 + ld r23, [sp, 24] ; Recover r23 + ld r22, [sp, 28] ; Recover r22 + ld r21, [sp, 32] ; Recover r21 + ld r20, [sp, 36] ; Recover r20 + ld r19, [sp, 40] ; Recover r19 + ld r18, [sp, 44] ; Recover r18 + ld r17, [sp, 48] ; Recover r17 + ld r16, [sp, 52] ; Recover r16 + ld r15, [sp, 56] ; Recover r15 + ld r14, [sp, 60] ; Recover r14 + ld r13, [sp, 64] ; Recover r13 + ld r1, [sp, 68] ; Pickup status32 + ld r30, [sp, 72] ; Recover r30 + add sp, sp, 76 ; Recover solicited stack frame + j_s.d [blink] ; Return to thread and restore flags + seti r1 ; Recover STATUS32 +; +__tx_thread_schedule_int_ret: +; + mov r0, 0x2 ; Pretend level 1 interrupt is returning + sr r0, [AUX_IRQ_ACT] ; + + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + ld r0, [sp, 156] ; Pickup saved BTA + sr r0, [BTA] ; Recover BTA + ld blink, [sp, 16] ; Recover blink + ld ilink, [sp, 20] ; Recover ilink + ld fp, [sp, 24] ; Recover fp + ld gp, [sp, 28] ; Recover gp + ld r25, [sp, 32] ; Recover r25 + ld r24, [sp, 36] ; Recover r24 + ld r23, [sp, 40] ; Recover r23 + ld r22, [sp, 44] ; Recover r22 + ld r21, [sp, 48] ; Recover r21 + ld r20, [sp, 52] ; Recover r20 + ld r19, [sp, 56] ; Recover r19 + ld r18, [sp, 60] ; Recover r18 + ld r17, [sp, 64] ; Recover r17 + ld r16, [sp, 68] ; Recover r16 + ld r15, [sp, 72] ; Recover r15 + ld r14, [sp, 76] ; Recover r14 + ld r13, [sp, 80] ; Recover r13 + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + ld r30, [sp, 136] ; Recover r30 + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt + +; +;} +; + .end + diff --git a/ports/arc_em/metaware/src/tx_thread_stack_build.s b/ports/arc_em/metaware/src/tx_thread_stack_build.s new file mode 100644 index 00000000..ecda6a4d --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_stack_build.s @@ -0,0 +1,205 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + .equ LONG_ALIGN_MASK, 0xFFFFFFFC + .equ INT_ENABLE_BITS, 0x8000001E +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, @function +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARCv2 EM should look like the following after it is built. +; Note that the extension registers are always assigned space here. +; +; Stack Top: 1 Interrupt stack frame type +; LP_START Initial loop start +; LP_END Initial loop end +; LP_COUNT Initial loop count +; blink Initial blink value +; ilink Initial ilink (point of interrupt) +; fp (r27) Initial fp (0) +; gp Initial gp +; r25 Initial r25 +; r24 Initial r24 +; r23 Initial r23 +; r22 Initial r22 +; r21 Initial r21 +; r20 Initial r20 +; r19 Initial r19 +; r18 Initial r18 +; r17 Initial r17 +; r16 Initial r16 +; r15 Initial r15 +; r14 Initial r14 +; r13 Initial r13 +; r12 Initial r12 +; r11 Initial r11 +; r10 Initial r10 +; r9 Initial r9 +; r8 Initial r8 +; r7 Initial r7 +; r6 Initial r6 +; r5 Initial r5 +; r4 Initial r4 +; r3 Initial r3 +; r2 Initial r2 +; r1 Initial r1 +; r0 Initial r0 +; r30 Initial r30 +; r58 Initial r58 +; r59 Initial r59 +; 0 Reserved +; 0 Reserved +; 0 Initial BTA +; 0 Point of Interrupt (thread entry point) +; 0 Initial STATUS32 +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; +; *: these registers will only be saved and restored if flag -Xxmac_d16 is passed to hcac +; +; Stack Bottom: (higher memory address) */ +; + ld r3, [r0, 16] ; Pickup end of stack area + and r3, r3, LONG_ALIGN_MASK ; Ensure long-word alignment + sub r3, r3, 196 ; Allocate an interrupt stack frame (ARCv2 EM) +; +; /* Actually build the stack frame. */ +; + st 1, [r3, 0] ; Store interrupt stack type on the + ; top of the stack + mov r5, 0 ; Build initial clear value + st r5, [r3, 4] ; Store initial LP_START + st r5, [r3, 8] ; Store initial LP_END + st r5, [r3, 12] ; Store initial LP_COUNT + st r5, [r3, 16] ; Store initial blink + st r1, [r3, 20] ; Store initial ilink + st r5, [r3, 24] ; Store initial fp (0 for backtrace) + st gp, [r3, 28] ; Store current gp + st r5, [r3, 32] ; Store initial r25 + st r5, [r3, 36] ; Store initial r24 + st r5, [r3, 40] ; Store initial r23 + st r5, [r3, 44] ; Store initial r22 + st r5, [r3, 48] ; Store initial r21 + st r5, [r3, 52] ; Store initial r20 + st r5, [r3, 56] ; Store initial r19 + st r5, [r3, 60] ; Store initial r18 + st r5, [r3, 64] ; Store initial r17 + st r5, [r3, 68] ; Store initial r16 + st r5, [r3, 72] ; Store initial r15 + st r5, [r3, 76] ; Store initial r14 + st r5, [r3, 80] ; Store initial r13 + st r5, [r3, 84] ; Store initial r12 + st r5, [r3, 88] ; Store initial r11 + st r5, [r3, 92] ; Store initial r10 + st r5, [r3, 96] ; Store initial r9 + st r5, [r3, 100] ; Store initial r8 + st r5, [r3, 104] ; Store initial r7 + st r5, [r3, 108] ; Store initial r6 + st r5, [r3, 112] ; Store initial r5 + st r5, [r3, 116] ; Store initial r4 + st r5, [r3, 120] ; Store initial r3 + st r5, [r3, 124] ; Store initial r2 + st r5, [r3, 128] ; Store initial r1 + st r5, [r3, 132] ; Store initial r0 + st r5, [r3, 136] ; Store initial r30 + st r5, [r3, 140] ; Store initial r58 + st r5, [r3, 144] ; Store initial r59 + st r5, [r3, 148] ; Reserved + st r5, [r3, 152] ; Reserved + st r5, [r3, 156] ; Store initial BTA + st r1, [r3, 160] ; Store initial point of entry + lr r6, [status32] ; Pickup STATUS32 + or r6, r6, INT_ENABLE_BITS ; Make sure interrupts are enabled + st r6, [r3, 164] ; Store initial STATUS32 + st r5, [r3, 168] ; Backtrace 0 + st r5, [r3, 172] ; Backtrace 0 + st r5, [r3, 176] ; Backtrace 0 + st r5, [r3, 180] ; Backtrace 0 +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r3; +; + j_s.d [blink] ; Return to caller + st r3, [r0, 8] ; Save stack pointer in thread's + ; control block +;} + .end + + diff --git a/ports/arc_em/metaware/src/tx_thread_system_return.s b/ports/arc_em/metaware/src/tx_thread_system_return.s new file mode 100644 index 00000000..61120d49 --- /dev/null +++ b/ports/arc_em/metaware/src/tx_thread_system_return.s @@ -0,0 +1,169 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; + .equ KSTACK_TOP, 0x264 + .equ KSTACK_BASE, 0x265 + .equ STATUS32_SC, 0x4000 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + .global _tx_thread_system_return + .type _tx_thread_system_return, @function +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; +; /* Lockout interrupts. */ +; + clri r2 ; Disable interrupts + sub sp, sp, 76 ; Allocate a solicited stack frame + mov r3, 0 ; Build a solicited stack type + st r3, [sp, 0] ; Store stack type on the top + st blink, [sp, 4] ; Save return address and flags + st fp, [sp, 8] ; Save fp + st r26, [sp, 12] ; Save r26 + st r25, [sp, 16] ; Save r25 + st r24, [sp, 20] ; Save r24 + st r23, [sp, 24] ; Save r23 + st r22, [sp, 28] ; Save r22 + st r21, [sp, 32] ; Save r21 + st r20, [sp, 36] ; Save r20 + st r19, [sp, 40] ; Save r19 + st r18, [sp, 44] ; Save r18 + st r17, [sp, 48] ; Save r17 + st r16, [sp, 52] ; Save r16 + st r15, [sp, 56] ; Save r15 + st r14, [sp, 60] ; Save r14 + st r13, [sp, 64] ; Save r13 + st r2, [sp, 68] ; Save status32 + st r30, [sp, 72] ; Save r30 +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + bl.d _tx_execution_thread_exit ; Call the thread exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + mov r3, 0 ; Build clear value + .endif +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + st sp, [r0, 8] ; Save thread's stack pointer + ld r5, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + + .ifdef TX_ENABLE_HW_STACK_CHECKING + lr r2, [status32] ; Pickup current STATUS32 + and r2, r2, ~STATUS32_SC ; Clear the hardware stack checking enable bit (SC) + kflag r2 ; Disable hardware stack checking + mov r1, _tx_system_stack_top_address ; Pickup top of system stack (lowest memory address) + sr r1, [KSTACK_TOP] ; Setup KSTACK_TOP + mov r1, _tx_system_stack_base_address ; Pickup base of system stack (highest memory address) + sr r1, [KSTACK_BASE] ; Setup KSTACK_BASE + .endif + + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + + .ifdef TX_ENABLE_HW_STACK_CHECKING + or r2, r2, STATUS32_SC ; Or in hardware stack checking enable bit (SC) + kflag r2 ; Enable hardware stack checking + .endif +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + breq r5, 0, __tx_thread_dont_save_ts ; If not, skip save processing +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r3, [gp, _tx_timer_time_slice@sda] ; Clear time-slice variable + st r5, [r0, 24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts: +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + b.d _tx_thread_schedule ; Return to scheduler.. + st r3, [gp, _tx_thread_current_ptr@sda] ; ..clearing current thread pointer +; +;} + .end + + diff --git a/ports/arc_em/metaware/src/tx_timer_interrupt.s b/ports/arc_em/metaware/src/tx_timer_interrupt.s new file mode 100644 index 00000000..4c5e241c --- /dev/null +++ b/ports/arc_em/metaware/src/tx_timer_interrupt.s @@ -0,0 +1,238 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARCv2_EM/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Process timer expiration */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* _tx_thread_context_save Save interrupt context */ +;/* _tx_thread_context_restore Restore interrupt context */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, @function +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed the interrupt stack frame has +; already been allocated and registers r0, r1, and r2 have already been saved +; at offsets 0, 4, and 8 respectively. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + clri ; Lockout interrupts + ld r0, [gp,_tx_timer_system_clock@sda] ; Pickup current system clock + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + add r0, r0, 1 ; Increment the system clock + st r0, [gp,_tx_timer_system_clock@sda] ; Store system clock back in memory + +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + mov r1, 0 ; Clear expiration flag + breq r2, 0, __tx_timer_no_time_slice ; If zero, no time-slice is active +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + sub r2, r2, 1 ; Decrement time-slice + st r2, [gp, _tx_timer_time_slice@sda] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + brne r2, 0, __tx_timer_no_time_slice ; If non-zero, skip over expiration +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + mov r1, 1 ; Set register flag + st r1, [gp, _tx_timer_expired_time_slice@sda] ; Set the time-slice expired flag + +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + ld r0, [gp, _tx_timer_current_ptr@sda] ; Pickup current timer pointer + ld r2, [r0, 0] ; Pickup examine actual list entry + breq r2, 0, __tx_timer_no_timer ; + ; If NULL, no timer has expired, just move to the next entry +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + mov r1, 1 ; Build expiration value + b.d __tx_timer_done ; Skip moving the timer pointer + st r1, [gp, _tx_timer_expired@sda] ; Set the expired value +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ld r2, [gp, _tx_timer_list_end@sda] ; Pickup end of list + add r0, r0, 4 ; Move to next timer entry +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + st r0, [gp, _tx_timer_current_ptr@sda] ; Store the current timer + brne r0, r2, __tx_timer_skip_wrap ; If not equal, don't wrap the list +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + ld r2, [gp, _tx_timer_list_start@sda] ; Pickup start of timer list + st r2, [gp, _tx_timer_current_ptr@sda] ; Set current timer to the start +; +__tx_timer_skip_wrap: +; +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + breq r1, 0, __tx_timer_nothing_expired ; If 0, nothing has expired +; +__tx_something_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Save interrupted context +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + ld r2, [gp, _tx_timer_expired@sda] ; Pickup timer expired flag + ld r4, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable + breq r2, 0, __tx_timer_dont_activate ; If not set, skip expiration processing +; +; /* Process the timer expiration. */ +; /* _tx_timer_expiration_process(); */ + bl.d _tx_timer_expiration_process ; Call the timer expiration handling routine + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + ld r2, [gp, _tx_timer_expired_time_slice@sda] ; Pickup expired time-slice flag + breq r2, 0, __tx_timer_not_ts_expiration ; If not set, skip time-slice +; +; /* Time slice interrupted thread. */ +; /* _tx_thread_time_slice(); */ + + bl.d _tx_thread_time_slice ; Call time-slice processing + sub sp, sp, 16 ; ..allocating some stack space + add sp, sp, 16 ; Recover stack space +; +; } +; +__tx_timer_not_ts_expiration: +; + st 0, [gp, _tx_timer_expired_time_slice@sda] + b _tx_thread_context_restore ; Go restore interrupt context.. + ; ..clearing time-slice expired flag + ; Note that we don't return from + ; this function. +; +; } +; +__tx_timer_nothing_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt +; +;} + .end + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.lock b/ports/arc_hs/metaware/example_build/.metadata/.lock new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_hs/metaware/example_build/.metadata/.log b/ports/arc_hs/metaware/example_build/.metadata/.log new file mode 100644 index 00000000..7c78bb33 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.log @@ -0,0 +1,2291 @@ +!SESSION 2015-09-28 16:00:20.788 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 -data C:\temp1663\tesp + +!ENTRY org.eclipse.cdt.core 1 0 2015-09-28 16:03:16.758 +!MESSAGE Indexed 'tx' (0 sources, 0 headers) in 0.003 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.cdt.core 1 0 2015-09-28 16:08:56.869 +!MESSAGE Indexed 'sample_threadx' (0 sources, 0 headers) in 0 sec: 0 declarations; 0 references; 0 unresolved inclusions; 0 syntax errors; 0 unresolved names (0%) + +!ENTRY org.eclipse.debug.core 4 5012 2015-09-28 16:13:02.280 +!MESSAGE org.xml.sax.SAXParseException; lineNumber: 438; columnNumber: 1; Content is not allowed in trailing section. occurred while reading launch configuration file: C:\temp1663\tesp\.metadata\.plugins\org.eclipse.debug.core\.launches\sample_threadx Debug.launch. +!STACK 0 +org.xml.sax.SAXParseException; lineNumber: 438; columnNumber: 1; Content is not allowed in trailing section. + at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) + at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) + at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441) + at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) + at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436) + at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$TrailingMiscDriver.next(XMLDocumentScannerImpl.java:1433) + at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) + at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) + at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) + at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) + at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) + at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) + at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348) + at org.eclipse.debug.internal.core.LaunchManager.createInfoFromXML(LaunchManager.java:954) + at org.eclipse.debug.internal.core.LaunchManager.getInfo(LaunchManager.java:1372) + at org.eclipse.debug.internal.core.LaunchConfiguration.getInfo(LaunchConfiguration.java:470) + at org.eclipse.debug.internal.core.LaunchConfiguration.getAttribute(LaunchConfiguration.java:416) + at org.eclipse.debug.ui.RefreshTab.getRefreshScope(RefreshTab.java:431) + at org.eclipse.cdt.launch.AbstractCLaunchDelegate$CLaunch.refresh(AbstractCLaunchDelegate.java:109) + at org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin.launchesTerminated(LaunchUIPlugin.java:225) + at org.eclipse.debug.internal.core.LaunchManager$LaunchesNotifier.run(LaunchManager.java:318) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.internal.core.LaunchManager$LaunchesNotifier.notify(LaunchManager.java:270) + at org.eclipse.debug.internal.core.LaunchManager.fireUpdate(LaunchManager.java:1055) + at org.eclipse.debug.core.Launch.fireTerminate(Launch.java:405) + at org.eclipse.debug.core.Launch.handleDebugEvents(Launch.java:577) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.e4.ui.workbench.swt 4 2 2015-09-28 16:13:17.470 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.swt". +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.run(OpenWorkspaceAction.java:264) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$OpenDialogAction.run(OpenWorkspaceAction.java:70) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more + +!ENTRY org.eclipse.e4.ui.workbench 4 0 2015-09-28 16:13:17.470 +!MESSAGE Exception occurred while unrendering: org.eclipse.e4.ui.model.application.ui.basic.impl.TrimmedWindowImpl@74d228 (elementId: IDEWindow, tags: [topLevel], contributorURI: platform:/plugin/org.eclipse.ui.workbench) (widget: null, renderer: null, toBeRendered: true, onTop: false, visible: true, containerData: null, accessibilityPhrase: null) (label: %trimmedwindow.label.eclipseSDK, iconURI: null, tooltip: null, context: null, variables: [], x: 369, y: 52, width: 1024, height: 775) +!STACK 0 +org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:62) + at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:888) + at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:390) + at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:143) + at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:76) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) + at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:70) + at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:175) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.clearContext(PartRenderingEngine.java:974) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeRemoveGui(PartRenderingEngine.java:954) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$3(PartRenderingEngine.java:862) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$8.run(PartRenderingEngine.java:857) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.removeGui(PartRenderingEngine.java:841) + at org.eclipse.ui.internal.WorkbenchWindow.hardClose(WorkbenchWindow.java:1937) + at org.eclipse.ui.internal.WorkbenchWindow.busyClose(WorkbenchWindow.java:1560) + at org.eclipse.ui.internal.WorkbenchWindow.access$15(WorkbenchWindow.java:1527) + at org.eclipse.ui.internal.WorkbenchWindow$10.run(WorkbenchWindow.java:1592) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.WorkbenchWindow.close(WorkbenchWindow.java:1589) + at org.eclipse.ui.internal.Workbench$14.run(Workbench.java:1155) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1137) + at org.eclipse.ui.internal.Workbench.access$21(Workbench.java:1079) + at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1410) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) + at org.eclipse.ui.internal.Workbench.close(Workbench.java:1407) + at org.eclipse.ui.internal.Workbench.restart(Workbench.java:2677) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.restart(OpenWorkspaceAction.java:282) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction.run(OpenWorkspaceAction.java:264) + at org.eclipse.ui.internal.ide.actions.OpenWorkspaceAction$OpenDialogAction.run(OpenWorkspaceAction.java:70) + at org.eclipse.jface.action.Action.runWithEvent(Action.java:519) + at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595) + at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511) + at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1085) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1070) + at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:782) + at org.eclipse.jface.action.ActionContributionItem$9.handleEvent(ActionContributionItem.java:1293) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) + at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061) + at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) +Caused by: org.eclipse.swt.SWTException: Widget is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Widget.error(Widget.java:476) + at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:348) + at org.eclipse.swt.widgets.Shell.getSize(Shell.java:1092) + at org.eclipse.ui.internal.quickaccess.SearchField.storeDialog(SearchField.java:580) + at org.eclipse.ui.internal.quickaccess.SearchField.dispose(SearchField.java:557) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 67 more +!SESSION 2015-10-02 16:29:55.871 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b69ccb, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b69ccb, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@9f0360, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@9f0360, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@112b637, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@112b637, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ea0b48, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ea0b48, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1eb8e9a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1eb8e9a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15d1204, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15d1204, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@184a296, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@184a296, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1ea4b65, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1ea4b65, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-02 16:30:38.664 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@f6839c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@f6839c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) + +!ENTRY org.eclipse.debug.core 4 2 2015-10-02 17:42:00.298 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.core". +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.debug.core 4 125 2015-10-02 17:42:00.298 +!MESSAGE An exception occurred while dispatching debug events. +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-05 13:04:20.828 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3cdce6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3cdce6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15453dc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15453dc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8e1f7, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8e1f7, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7edea3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7edea3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ffee26, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ffee26, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1149b96, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1149b96, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7c6dda, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7c6dda, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3d31b0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3d31b0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-05 13:23:37.148 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@12a690f, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@12a690f, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SESSION 2015-10-06 09:33:14.510 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8206aa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8206aa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@e8535e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@e8535e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1f4742b, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1f4742b, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b3de87, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1b3de87, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@132284d, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@132284d, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15ae856, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15ae856, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15b83fa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15b83fa, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3b3ab0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@3b3ab0, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-06 09:48:22.677 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@55167a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@55167a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SESSION 2015-10-08 14:32:52.274 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 -data C:\temp1663\working_base_hs + +!ENTRY org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d85a18, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d85a18, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1575bad, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1575bad, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1e89472, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1e89472, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1965d0c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1965d0c, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@182d1bc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@182d1bc, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8d7592, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@8d7592, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@19737f5, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@19737f5, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@aa73f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@aa73f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-08 14:58:59.494 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15e422e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@15e422e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) + +!ENTRY org.eclipse.cdt.debug.core 4 1000 2015-10-08 15:24:49.427 +!MESSAGE Internal error logged from CDI Debug: +!STACK 0 +org.eclipse.cdt.debug.core.cdi.TargetInvocationException: Can't load "C:\temp1663\working_base_hs\sample_threadx\Debug\sample_threadx.elf"[] + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.loadProgram(Target.java:1289) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.confirmLoaded(Target.java:945) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.getRegisterGroups(Target.java:1816) + at org.eclipse.cdt.debug.internal.core.CRegisterManager.initialize(CRegisterManager.java:138) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.getRegisterManager(CDebugTarget.java:1808) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initializeRegisters(CDebugTarget.java:425) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initialize(CDebugTarget.java:319) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.(CDebugTarget.java:301) + at org.eclipse.cdt.debug.core.CDIDebugModel$1.run(CDIDebugModel.java:133) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2295) + at org.eclipse.cdt.debug.core.CDIDebugModel.newDebugTarget(CDIDebugModel.java:138) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchLocalDebugSession(LocalCDILaunchDelegate.java:213) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchDebugger(LocalCDILaunchDelegate.java:136) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launch(LocalCDILaunchDelegate.java:80) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:885) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:739) + at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1039) + at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1256) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.cdt.debug.core 4 1000 2015-10-08 15:25:33.059 +!MESSAGE Internal error logged from CDI Debug: +!STACK 0 +org.eclipse.cdt.debug.core.cdi.TargetInvocationException: Can't load "C:\temp1663\working_base_hs\sample_threadx\Debug\sample_threadx.elf"[] + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.loadProgram(Target.java:1289) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.confirmLoaded(Target.java:945) + at com.arc.cdt.debug.seecode.internal.core.cdi.Target.getRegisterGroups(Target.java:1816) + at org.eclipse.cdt.debug.internal.core.CRegisterManager.initialize(CRegisterManager.java:138) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.getRegisterManager(CDebugTarget.java:1808) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initializeRegisters(CDebugTarget.java:425) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.initialize(CDebugTarget.java:319) + at org.eclipse.cdt.debug.internal.core.model.CDebugTarget.(CDebugTarget.java:301) + at org.eclipse.cdt.debug.core.CDIDebugModel$1.run(CDIDebugModel.java:133) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2313) + at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2295) + at org.eclipse.cdt.debug.core.CDIDebugModel.newDebugTarget(CDIDebugModel.java:138) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchLocalDebugSession(LocalCDILaunchDelegate.java:213) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launchDebugger(LocalCDILaunchDelegate.java:136) + at org.eclipse.cdt.launch.internal.LocalCDILaunchDelegate.launch(LocalCDILaunchDelegate.java:80) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:885) + at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:739) + at org.eclipse.debug.internal.ui.DebugUIPlugin.buildAndLaunch(DebugUIPlugin.java:1039) + at org.eclipse.debug.internal.ui.DebugUIPlugin$8.run(DebugUIPlugin.java:1256) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-09 15:41:22.142 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.debug.ui 4 2 2015-10-09 16:32:33.850 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.ui". +!STACK 0 +java.lang.NullPointerException + at org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer.getSourceContainers(CompositeSourceContainer.java:134) + at org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils.getCompilationPath(SourceUtils.java:205) + at org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector.getCompilationPath(CSourceLookupDirector.java:181) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.convertPath(RunToLineAdapter.java:171) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.canRunToLine(RunToLineAdapter.java:141) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction.canPerformAction(RetargetRunToLineAction.java:95) + at org.eclipse.debug.internal.ui.actions.RetargetAction.isTargetEnabled(RetargetAction.java:245) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.contextActivated(RetargetRunToLineAction.java:51) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.debugContextChanged(RetargetRunToLineAction.java:57) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService$1.run(DebugWindowContextService.java:223) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:220) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:195) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.debugContextChanged(DebugWindowContextService.java:436) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$ContextProviderProxy.debugContextChanged(LaunchView.java:518) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.possibleChange(LaunchView.java:404) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider$Visitor.visit(LaunchView.java:326) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:401) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.accept(ModelDelta.java:397) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.modelChanged(LaunchView.java:434) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.doModelChanged(TreeModelContentProvider.java:427) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.access$0(TreeModelContentProvider.java:413) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider$2.run(TreeModelContentProvider.java:401) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4147) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3764) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) + +!ENTRY org.eclipse.debug.ui 4 120 2015-10-09 16:32:33.881 +!MESSAGE Error logged from Debug UI: +!STACK 0 +java.lang.NullPointerException + at org.eclipse.debug.core.sourcelookup.containers.CompositeSourceContainer.getSourceContainers(CompositeSourceContainer.java:134) + at org.eclipse.cdt.debug.internal.core.sourcelookup.SourceUtils.getCompilationPath(SourceUtils.java:205) + at org.eclipse.cdt.debug.internal.core.sourcelookup.CSourceLookupDirector.getCompilationPath(CSourceLookupDirector.java:181) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.convertPath(RunToLineAdapter.java:171) + at org.eclipse.cdt.debug.internal.ui.actions.RunToLineAdapter.canRunToLine(RunToLineAdapter.java:141) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction.canPerformAction(RetargetRunToLineAction.java:95) + at org.eclipse.debug.internal.ui.actions.RetargetAction.isTargetEnabled(RetargetAction.java:245) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.contextActivated(RetargetRunToLineAction.java:51) + at org.eclipse.debug.internal.ui.actions.RetargetRunToLineAction$DebugContextListener.debugContextChanged(RetargetRunToLineAction.java:57) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService$1.run(DebugWindowContextService.java:223) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:220) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.notify(DebugWindowContextService.java:195) + at org.eclipse.debug.internal.ui.contexts.DebugWindowContextService.debugContextChanged(DebugWindowContextService.java:436) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$ContextProviderProxy.debugContextChanged(LaunchView.java:518) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider$1.run(AbstractDebugContextProvider.java:83) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.ui.contexts.AbstractDebugContextProvider.fire(AbstractDebugContextProvider.java:80) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.possibleChange(LaunchView.java:404) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider$Visitor.visit(LaunchView.java:326) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:401) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.doAccept(ModelDelta.java:404) + at org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta.accept(ModelDelta.java:397) + at org.eclipse.debug.internal.ui.views.launch.LaunchView$TreeViewerContextProvider.modelChanged(LaunchView.java:434) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.doModelChanged(TreeModelContentProvider.java:427) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider.access$0(TreeModelContentProvider.java:413) + at org.eclipse.debug.internal.ui.viewers.model.TreeModelContentProvider$2.run(TreeModelContentProvider.java:401) + at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) + at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:136) + at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4147) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3764) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:135) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:483) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) + at org.eclipse.equinox.launcher.Main.run(Main.java:1465) + +!ENTRY org.eclipse.debug.core 4 2 2015-10-09 17:50:18.411 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.core". +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.debug.core 4 125 2015-10-09 17:50:18.411 +!MESSAGE An exception occurred while dispatching debug events. +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-12 11:12:05.433 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1a045bd, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1a045bd, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@fada78, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@fada78, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@cc9674, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@cc9674, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@120387e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@120387e, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d8100a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d8100a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d925b3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d925b3, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d46f2a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@d46f2a, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@754906, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@754906, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 11:45:51.753 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@db5482, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@db5482, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) + +!ENTRY org.eclipse.debug.core 4 2 2015-10-12 13:31:22.583 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.debug.core". +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.debug.core 4 125 2015-10-12 13:31:22.583 +!MESSAGE An exception occurred while dispatching debug events. +!STACK 0 +org.eclipse.swt.SWTException: Device is disposed + at org.eclipse.swt.SWT.error(SWT.java:4441) + at org.eclipse.swt.SWT.error(SWT.java:4356) + at org.eclipse.swt.SWT.error(SWT.java:4327) + at org.eclipse.swt.widgets.Display.error(Display.java:1258) + at org.eclipse.swt.widgets.Display.getThread(Display.java:2602) + at org.eclipse.debug.internal.ui.stringsubstitution.SelectedResourceManager.getActiveWindow(SelectedResourceManager.java:239) + at org.eclipse.debug.ui.DebugUITools.getDebugContext(DebugUITools.java:229) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.update(RemoveAllGlobalsActionDelegate.java:99) + at org.eclipse.cdt.debug.internal.ui.actions.RemoveAllGlobalsActionDelegate.handleDebugEvents(RemoveAllGlobalsActionDelegate.java:131) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.run(DebugPlugin.java:1151) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.debug.core.DebugPlugin$EventNotifier.dispatch(DebugPlugin.java:1187) + at org.eclipse.debug.core.DebugPlugin$EventDispatchJob.run(DebugPlugin.java:431) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2015-10-12 13:33:52.888 ----------------------------------------------- +eclipse.buildId=unknown +java.version=1.8.0_25 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for F3: +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@906078, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F3, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.opendecl,Open Declaration, + Opens an editor on the selected element's declaration(s), + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@906078, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+SHIFT+G: +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1d5c7f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.findrefs,References, + Searches for references to the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@1d5c7f6, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+G: +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@124ab90, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+G, + ParameterizedCommand(Command(org.eclipse.cdt.ui.search.finddecl,Declaration, + Searches for declarations of the selected element in the workspace, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@124ab90, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for ALT+CTRL+H: +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ef1934, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.call.hierarchy,Open Call Hierarchy, + Opens the call hierarchy for the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@ef1934, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+SHIFT+H: +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@11522f1, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+H, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.open.type.in.hierarchy,Open Type in Hierarchy, + Open a type in the type hierarchy view, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@11522f1, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for F4: +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5eba52, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(F4, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.type.hierarchy,Open Type Hierarchy, + Open a type hierarchy on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@5eba52, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for ALT+SHIFT+R: +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@34f8e2, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+SHIFT+R, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.text.rename.element,Rename - Refactoring , + Renames the selected element, + Category(org.eclipse.cdt.ui.category.refactoring,Refactor - C++,C/C++ Refactorings,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@34f8e2, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for CTRL+SHIFT+T: +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@2a7429, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(CTRL+SHIFT+T, + ParameterizedCommand(Command(org.eclipse.cdt.ui.navigate.opentype,Open Element, + Open an element in an Editor, + Category(org.eclipse.cdt.ui.category.source,C/C++ Source,C/C++ Source Actions,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@2a7429, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SUBENTRY 1 org.eclipse.jface 2 0 2015-10-12 13:34:34.005 +!MESSAGE A conflict occurred for ALT+CTRL+I: +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8c837, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cEditorScope,,,system) +Binding(ALT+CTRL+I, + ParameterizedCommand(Command(org.eclipse.cdt.ui.edit.open.include.browser,Open Include Browser, + Open an include browser on the selected element, + Category(org.eclipse.ui.category.navigate,Navigate,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@a8c837, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.cdt.ui.cViewScope,,,system) +!SESSION 2020-06-17 17:46:26.532 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 17:46:42.545 +!MESSAGE Could not run processor +!STACK 0 +org.eclipse.e4.core.di.InjectionException: java.lang.NullPointerException + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:282) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:259) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:107) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessor(ModelAssembler.java:335) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.runProcessors(ModelAssembler.java:297) + at org.eclipse.e4.ui.internal.workbench.ModelAssembler.processModel(ModelAssembler.java:98) + at org.eclipse.e4.ui.internal.workbench.ResourceHandler.loadMostRecentModel(ResourceHandler.java:197) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.loadApplicationModel(E4Application.java:377) + at org.eclipse.e4.ui.internal.workbench.swt.E4Application.createE4Workbench(E4Application.java:252) + at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:632) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +Caused by: java.lang.NullPointerException + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectLaunchBar(LaunchBarInjector.java:109) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.injectIntoAll(LaunchBarInjector.java:84) + at org.eclipse.cdt.launchbar.ui.internal.LaunchBarInjector.execute(LaunchBarInjector.java:46) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) + ... 26 more + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 17:46:47.752 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 17:46:47.787 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:46:47.787 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:46:47.787 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 17:46:47.806 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:46:47.807 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 17:46:48.173 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. +!SESSION 2020-06-17 17:47:25.082 ----------------------------------------------- +eclipse.buildId=unknown +java.fullversion=1.8.0_212-b03 +JRE 1.8.0 Windows 8 amd64-64-Bit Compressed References 20190417_339 (JIT enabled, AOT enabled) +OpenJ9 - bad1d4d06 +OMR - 4a4278e6 +JCL - 5590c4f818 based on jdk8u212-b03 +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US +Command-line arguments: -os win32 -ws win32 -arch x86_64 + +!ENTRY org.eclipse.core.resources 4 567 2020-06-17 17:47:30.736 +!MESSAGE Workspace restored, but some problems occurred. +!SUBENTRY 1 org.eclipse.core.resources 4 567 2020-06-17 17:47:30.736 +!MESSAGE Could not read metadata for 'demo_threadx'. +!STACK 1 +org.eclipse.core.internal.resources.ResourceException: The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + at org.eclipse.core.internal.localstore.FileSystemResourceManager.read(FileSystemResourceManager.java:907) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:904) + at org.eclipse.core.internal.resources.SaveManager.restoreMetaInfo(SaveManager.java:884) + at org.eclipse.core.internal.resources.SaveManager.restore(SaveManager.java:735) + at org.eclipse.core.internal.resources.SaveManager.startup(SaveManager.java:1587) + at org.eclipse.core.internal.resources.Workspace.startup(Workspace.java:2399) + at org.eclipse.core.internal.resources.Workspace.open(Workspace.java:2156) + at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:464) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:36) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:419) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) + at org.eclipse.equinox.launcher.Main.run(Main.java:1519) +!SUBENTRY 2 org.eclipse.core.resources 4 567 2020-06-17 17:47:30.738 +!MESSAGE The project description file (.project) for 'demo_threadx' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + +!ENTRY org.eclipse.osgi 4 0 2020-06-17 17:47:33.892 +!MESSAGE An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). +!STACK 0 +org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +Root exception: +java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) + +!ENTRY org.eclipse.ui.workbench 4 2 2020-06-17 17:47:33.922 +!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:47:33.922 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:47:33.922 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.ui 4 0 2020-06-17 17:47:33.942 +!MESSAGE Unable to execute early startup code for the org.eclipse.ui.IStartup extension contributed by the 'com.synopsys.cdt.cnn.tools.ui' plug-in. +!STACK 1 +org.eclipse.core.runtime.CoreException: Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:176) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + ... 10 more +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more +!SUBENTRY 1 org.eclipse.equinox.registry 4 1 2020-06-17 17:47:33.942 +!MESSAGE Plug-in com.synopsys.cdt.cnn.tools.ui was unable to load class com.synopsys.cdt.cnn.tools.ui.LoadedAtStartup. +!STACK 0 +java.lang.ClassNotFoundException: An error occurred while automatically activating bundle com.synopsys.cdt.cnn.tools.ui (25). + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:116) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:529) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:325) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:345) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:423) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:372) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:364) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161) + at java.lang.ClassLoader.loadClass(ClassLoader.java:874) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:564) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:174) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55) + at org.eclipse.ui.internal.WorkbenchPlugin$1.run(WorkbenchPlugin.java:291) + at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:52) + at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:286) + at org.eclipse.ui.internal.EarlyStartupRunnable.run(EarlyStartupRunnable.java:53) + at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) + at org.eclipse.ui.internal.Workbench$55.run(Workbench.java:2835) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) +Caused by: org.osgi.framework.BundleException: Exception in com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start() of bundle com.synopsys.cdt.cnn.tools.ui. + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:795) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:724) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:932) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:309) + at org.eclipse.osgi.container.Module.doStart(Module.java:581) + at org.eclipse.osgi.container.Module.start(Module.java:449) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:470) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:107) + ... 20 more +Caused by: java.lang.NullPointerException + at org.eclipse.core.runtime.Path.(Path.java:228) + at org.eclipse.core.runtime.Path.(Path.java:186) + at com.synopsys.cdt.cnn.tools.ui.Netron.registerExt(Netron.java:12) + at com.synopsys.cdt.cnn.tools.ui.CNNToolsUIPlugin.start(CNNToolsUIPlugin.java:52) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:774) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(AccessController.java:703) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:767) + ... 27 more + +!ENTRY org.eclipse.e4.ui.workbench 2 0 2020-06-17 17:47:34.252 +!MESSAGE Removing part descriptor with the 'org.eclipse.cdt.debug.ui.DisassemblyView' id and the 'Disassembly' description. Points to the invalid 'bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.e4.compatibility.CompatibilityView' class. + +!ENTRY org.eclipse.cdt.core 1 0 2020-06-17 17:47:51.232 +!MESSAGE Indexed 'sample_threadx' (1 sources, 0 headers) in 0.18 sec: 60 declarations; 165 references; 1 unresolved inclusions; 0 syntax errors; 105 unresolved names (32%) diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 00000000..8cdd960c --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/.log @@ -0,0 +1,16 @@ +*** SESSION Sep 28, 2015 16:00:26.42 ------------------------------------------- +*** SESSION Sep 28, 2015 16:24:47.48 ------------------------------------------- +*** SESSION Sep 28, 2015 16:43:36.06 ------------------------------------------- +*** SESSION Oct 01, 2015 14:52:43.41 ------------------------------------------- +*** SESSION Oct 01, 2015 16:50:35.31 ------------------------------------------- +*** SESSION Oct 02, 2015 16:30:04.53 ------------------------------------------- +*** SESSION Oct 05, 2015 13:04:34.94 ------------------------------------------- +*** SESSION Oct 05, 2015 17:02:39.29 ------------------------------------------- +*** SESSION Oct 06, 2015 09:33:29.71 ------------------------------------------- +*** SESSION Oct 08, 2015 14:32:58.71 ------------------------------------------- +*** SESSION Oct 09, 2015 15:42:00.42 ------------------------------------------- +*** SESSION Oct 12, 2015 11:13:19.78 ------------------------------------------- +*** SESSION Oct 12, 2015 13:34:17.27 ------------------------------------------- +*** SESSION Oct 12, 2015 13:59:21.03 ------------------------------------------- +*** SESSION Jun 17, 2020 17:46:46.45 ------------------------------------------- +*** SESSION Jun 17, 2020 17:47:32.95 ------------------------------------------- diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1443481736829.pdom b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1443481736829.pdom new file mode 100644 index 00000000..ffd8c301 Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1443481736829.pdom differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592441271034.pdom b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592441271034.pdom new file mode 100644 index 00000000..7bd45dd9 Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.1592441271034.pdom differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml new file mode 100644 index 00000000..36c65ec2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/sample_threadx.language.settings.xml @@ -0,0 +1,4753 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml new file mode 100644 index 00000000..c4b91cfa --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/shareddefaults.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1443481396650.pdom b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1443481396650.pdom new file mode 100644 index 00000000..82293280 Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.1443481396650.pdom differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml new file mode 100644 index 00000000..cec722e2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.core/tx.language.settings.xml @@ -0,0 +1,6213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp new file mode 100644 index 00000000..e69de29b diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 00000000..c552249b --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+
+
+
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index new file mode 100644 index 00000000..1798e670 Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/sample_threadx/.indexes/properties.index differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index new file mode 100644 index 00000000..df665a74 Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.projects/tx/.indexes/properties.index differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version new file mode 100644 index 00000000..25cb955b --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 00000000..bb2b32af Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version new file mode 100644 index 00000000..6b2aaa76 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/16.tree b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/16.tree new file mode 100644 index 00000000..cf82fb3e Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.root/16.tree differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 00000000..856fa638 Binary files /dev/null and b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-sample_threadx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs new file mode 100644 index 00000000..9c00dc4e --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-tx.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +indexer/preferenceScope=0 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..9531fc3c --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +org.eclipse.cdt.debug.corecDebug.Disassembly.instructionStepOn=true diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs new file mode 100644 index 00000000..c03690a1 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.ui.prefs @@ -0,0 +1,7 @@ +columnOrderKeyEXE=0,1,2,3,4,5 +columnOrderKeySF=0,1,2,3,4,5 +columnSortDirectionKeyEXE=128 +columnSortDirectionKeySF=128 +eclipse.preferences.version=1 +visibleColumnsKeyEXE=1,1,1,0,0,0 +visibleColumnsKeySF=1,1,0,0,0,0 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs new file mode 100644 index 00000000..c002721a --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.launchbar.core.prefs @@ -0,0 +1,5 @@ +activeConfigDesc=sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default +configDescList=[sample_threadx Debug.org.eclipse.cdt.launchbar.core.descriptor.default] +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchMode=debug +sample_threadx\ Debug.org.eclipse.cdt.launchbar.core.descriptor.default/activeLaunchTarget=org.eclipse.cdt.launchbar.core.target.local +eclipse.preferences.version=1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 00000000..db7c08cf --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2hs.exeProject.1700533761/com.arc.cdt.toolchain.av2hs.exeDebugConfig.585788724=av2hs.exe.debug.exeCompilerDebug.1743110770\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeDebugConfig.585788724\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.asmDebugExe.1483523628\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeToolChainDebug.1358823635\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.arc.archiver.886382681\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeLinkerDebug.672502322\=rebuildState\\\=false\\r\\n\r\n +properties/sample_threadx.com.arc.cdt.toolchain.arc.av2hs.exeProject.1700533761/com.arc.cdt.toolchain.av2hs.exeReleaseConfig.2024992869=com.arc.cdt.toolchain.av2hs.exelinkerRelease.934772409\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.asmReleaseExe.813382130\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.exeReleaseToolChain.202924782\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.archiver.990750758\=rebuildState\\\=true\\r\\n\r\narc.cdt.toolchain.av2hs.exeCompilerRelease.1463268267\=rebuildState\\\=true\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2hs.libProject.1128858457/com.arc.cdt.toolchain.av2hs.libDebugConfig.2063275274=com.arc.cdt.toolchain.av2hs.ArDebug.1591578035\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.41800372\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libDebugAsm.1626881776\=rebuildState\\\=false\\r\\n\r\nav2hs.lib.debug.libCompiler.2145942775\=rebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libDebugConfig.2063275274\=rcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libDebugToolChain.1385404397\=rebuildState\\\=false\\r\\n\r\n +properties/tx.com.arc.cdt.toolchain.arc.av2hs.libProject.1128858457/com.arc.cdt.toolchain.av2hs.libReleaseConfig.1202427021=com.arc.cdt.toolchain.av2hs.libCompilerRelease.1920721386\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libReleaseAsm.1207600374\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.ArRelease.217147730\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.av2hs.libReleaseToolChain.1456119623\=rebuildState\\\=true\\r\\n\r\ncom.arc.cdt.toolchain.arc.Linker.1382145468\=rebuildState\\\=true\\r\\n\r\n diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs new file mode 100644 index 00000000..5e2da66d --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..dffc6b51 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 00000000..47236716 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,5 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.localCLaunch=org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +eclipse.preferences.version=1 +prefWatchExpressions=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 00000000..f2a15ec2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,10 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +org.eclipse.debug.ui.user_view_bindings=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.BreakpointView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.DebugVieworg.eclipse.debug.ui.DebugView=\r\n +pref_state_memento.org.eclipse.debug.ui.ExpressionView=\r\n\r\n\r\n\r\n\r\n +pref_state_memento.org.eclipse.debug.ui.ModuleView=\r\n +pref_state_memento.org.eclipse.debug.ui.VariableView=\r\n +preferredDetailPanes=DefaultDetailPane\:DefaultDetailPane| +preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget|org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs new file mode 100644 index 00000000..61f3bb8b --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +overviewRuler_migration=migrated_3.1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs new file mode 100644 index 00000000..76ce67b9 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs @@ -0,0 +1,5 @@ +PROBLEMS_FILTERS_MIGRATE=true +eclipse.preferences.version=1 +platformState=1590536495337 +quickStart=true +tipsAndTricks=true diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 00000000..08076f23 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 00000000..60e7be60 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,4 @@ +//org.eclipse.ui.commands/state/org.eclipse.ui.navigator.resources.nested.changeProjectPresentation/org.eclipse.ui.commands.radioState=false +UIActivities.com.arc.cdt.debug.seecode.ui.activity1=true +UIActivities.org.eclipse.cdt.debug.cdigdbActivity=true +eclipse.preferences.version=1 diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch new file mode 100644 index 00000000..d8303802 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.core/.launches/sample_threadx Debug.launch @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 00000000..c13038c2 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,11 @@ + +
+
+ + + + + + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 00000000..c22cfeb5 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml new file mode 100644 index 00000000..2e57abac --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.ui.workbench.swt/dialog_settings.xml @@ -0,0 +1,14 @@ + +
+
+ + + + + + + + + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 00000000..5a2b8bd8 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,1828 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + + + + topLevel + shellMaximized + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.SearchActionSet + persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.ui.CView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.TaskList + persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard1 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewCWizard2 + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView + persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet + persp.actionSet:org.eclipse.cdt.ui.OpenActionSet + persp.actionSet:org.eclipse.cdt.ui.CodingActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation + persp.showIn:org.eclipse.cdt.ui.includeBrowser + persp.showIn:org.eclipse.cdt.ui.CView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.cdt.ui.includeBrowser + persp.actionSet:org.eclipse.debug.ui.debugActionSet + + + newtablook + active + + + + + + + + + + newtablook + + + + + + + + newtablook + Debug + + + + + + + + + + + + persp.actionSet:com.arc.eclipse.aboutMWDebugger + persp.actionSet:com.arc.cdt.toolchain.PDFs + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.debug.ui.debugActionSet + persp.viewSC:org.eclipse.debug.ui.DebugView + persp.viewSC:org.eclipse.debug.ui.VariableView + persp.viewSC:org.eclipse.debug.ui.BreakpointView + persp.viewSC:org.eclipse.debug.ui.ExpressionView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.disasm + persp.viewSC:com.arc.cdt.debug.seecode.ui.command + persp.viewSC:com.arc.cdt.debug.seecode.ui.views.memsearch + persp.viewSC:com.arc.cdt.seecode.errorlog + persp.viewSC:org.eclipse.cdt.debug.ui.SignalsView + persp.viewSC:org.eclipse.cdt.debug.ui.RegisterView + persp.viewSC:org.eclipse.debug.ui.ModuleView + persp.viewSC:org.eclipse.debug.ui.MemoryView + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.debug.ui.executablesView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSet + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt + persp.viewSC:org.eclipse.cdt.dsf.gdb.ui.tracecontrol.view + persp.viewSC:org.eclipse.cdt.dsf.debug.ui.disassembly.view + persp.perspSC:org.eclipse.cdt.ui.CPerspective + persp.viewSC:org.eclipse.cdt.visualizer.view + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.actionSet:org.eclipse.cdt.debug.ui.debugActionSetExt2 + + + + + + newtablook + org.eclipse.e4.primaryNavigationStack + + + + + newtablook + + + + + newtablook + + + + + + + + + + + + + + + + + + + + + + + newtablook + + + + + + newtablook + org.eclipse.e4.secondaryNavigationStack + + + + + + + + + Standalone + + + + + + + newtablook + org.eclipse.e4.secondaryDataStack + + + + + + + + + + + newtablook + + + + + + + + + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Help + + + + newtablook + org.eclipse.e4.primaryDataStack + EditorStack + + + + + View + categoryTag:General + active + activeOnClose + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:&C/C++ + + + View + categoryTag:General + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:General + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Make + + + View + categoryTag:Terminal + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + View + categoryTag:Debug + + ViewMenu + menuContribution:menu + + + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:&C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + + + View + categoryTag:Terminal + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history new file mode 100644 index 00000000..e2d080cb --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.history @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index new file mode 100644 index 00000000..e3eb0266 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2020/6/25/refactorings.index @@ -0,0 +1 @@ +1592441257832 Delete resource 'demo_threadx' diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml new file mode 100644 index 00000000..aa267842 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml @@ -0,0 +1,7 @@ + +
+
+ + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 00000000..50f1edb3 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
+
+
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 00000000..9c5013b7 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,22 @@ + +
+
+ + + + + + + + + +
+
+ + +
+
+ + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 00000000..c8e48664 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,30 @@ + +
+
+ + + + + + + + + + +
+
+ + + + +
+
+ + + + + + + +
+
diff --git a/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 00000000..373b8d71 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ports/arc_hs/metaware/example_build/.metadata/version.ini b/ports/arc_hs/metaware/example_build/.metadata/version.ini new file mode 100644 index 00000000..044ab217 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/.metadata/version.ini @@ -0,0 +1,3 @@ +#Wed Jun 17 17:47:30 PDT 2020 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.6.3.v20170301-0400 diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.bp.args b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.args new file mode 100644 index 00000000..020c9022 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.args @@ -0,0 +1,3 @@ +location=_tx_thread_system_return +condition_enabled=0 +cond= diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties new file mode 100644 index 00000000..8e467ac1 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.bp.properties @@ -0,0 +1,13 @@ +#Debugger engine properties +#Fri Oct 02 16:50:37 PDT 2015 +ARG_ACTION={"location\=_tx_thread_system_return" "condition_enabled\=0" "cond\=" } +docTitle=break_dialog +LOCATION=_tx_thread_system_return +on_push=bpsaved +TYPE=either +TEMPORARY=false +OK_ON_ENTER=1 +OK_ENABLED=1 +ReadingXML=false +THREAD_SPECIFIC=false +CONDITION_ENABLED=false diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.cproject b/ports/arc_hs/metaware/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..e782f2f6 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.cproject @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.project b/ports/arc_hs/metaware/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml b/ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..c63b0e46 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..5a03f35c --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); + + return(0); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd new file mode 100644 index 00000000..6c2dfb8a --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/sample_threadx.cmd @@ -0,0 +1,54 @@ +// +// This is the linker script example (SRV3-style). +// (c) Synopsys, 2013 +// +// + +//number of exceptions and interrupts +NUMBER_OF_EXCEPTIONS = 16;//it is fixed (16) +NUMBER_OF_INTERRUPTS = 5;//depends on HW configuration + +//define Interrupt Vector Table size +IVT_SIZE_ITEMS = (NUMBER_OF_EXCEPTIONS + NUMBER_OF_INTERRUPTS);//the total IVT size (in "items") +IVT_SIZE_BYTES = IVT_SIZE_ITEMS * 4;//in bytes + +//define ICCM and DCCM locations +MEMORY { + + ICCM: ORIGIN = 0x00000000, LENGTH = 128K + DCCM: ORIGIN = 0x80000000, LENGTH = 128K +} + +//define sections and groups +SECTIONS { + GROUP: { + .ivt (TEXT) : # Interrupt table + { + ___ivt1 = .; + * (.ivt) + ___ivt2 = .; + // Make the IVT at least IVT_SIZE_BYTES + . += (___ivt2 - ___ivt1 < IVT_SIZE_BYTES) ? (IVT_SIZE_BYTES - (___ivt2 - ___ivt1)) : 0; + } + .ivh (TEXT) : // Interrupt handlers + + //TEXT sections + .text? : { *('.text$crt*') } + * (TEXT): {} + //Literals + * (LIT): {} + } > ICCM + + GROUP: { + //data sections + .sdata?: {} + .sbss?: {} + *(DATA): {} + *(BSS): {} + //stack + .stack ALIGN(4) SIZE(DEFINED _STACKSIZE?_STACKSIZE:4096): {} + //heap (empty) + .heap? ALIGN(4) SIZE(DEFINED _HEAPSIZE?_HEAPSIZE:0): {} + .free_memory: {} + } > DCCM + } diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s b/ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s new file mode 100644 index 00000000..da17b687 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/tx_initialize_low_level.s @@ -0,0 +1,328 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; + .equ IRQ_SELECT, 0x40B + +; +; +; /* Define section for placement after all linker allocated RAM memory. This +; is used to calculate the first free address that is passed to +; tx_appication_define, soley for the ThreadX application's use. */ +; + .section ".free_memory","aw" + .align 4 + .global _tx_first_free_address +_tx_first_free_address: + .space 4 +; +; + .text +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + st sp, [gp, _tx_thread_system_stack_ptr@sda] ; Save system stack pointer +; +; +; /* Pickup the first available memory address. */ +; + mov r0, _tx_first_free_address ; Pickup first free memory address +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) _end; +; + st r0, [gp, _tx_initialize_unused_memory@sda] +; +; +; /* Setup Timer 0 for periodic interrupts at interrupt vector 16. */ +; + mov r0, 0 ; Disable additional ISR reg saving/restoring + sr r0, [AUX_IRQ_CTRL] ; + + mov r0, 16 ; Select timer 0 + sr r0, [IRQ_SELECT] ; + mov r0, 15 ; Set timer 0 to priority 15 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10000 ; Setup timer period + sr r0, [LIMIT0] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT0] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL0] ; + + .ifdef TX_TIMER_1_SETUP + mov r0, 17 ; Select timer 1 + sr r0, [IRQ_SELECT] ; + mov r0, 0 ; Set timer 1 to priority 0 + sr r0, [IRQ_PRIORITY] ; + mov r0, 1 ; Enable this interrupt + sr r0, [IRQ_ENABLE] ; + mov r0, 0x10020 ; Setup timer period + sr r0, [LIMIT1] ; + mov r0, 0 ; Clear timer 0 current count + sr r0, [COUNT1] ; + mov r0, 3 ; Enable timer 0 + sr r0, [CONTROL1] ; + .endif +; +; /* Done, return to caller. */ +; + j_s.d [blink] ; Return to caller + nop +;} +; +; +; /* Define default vector table entries. */ +; + .global _tx_memory_error +_tx_memory_error: + flag 1 + nop + nop + nop + b _tx_memory_error + + .global _tx_instruction_error +_tx_instruction_error: + flag 1 + nop + nop + nop + b _tx_instruction_error + + .global _tx_ev_machine_check +_tx_ev_machine_check: + flag 1 + nop + nop + nop + b _tx_ev_machine_check + + .global _tx_ev_tblmiss_inst +_tx_ev_tblmiss_inst: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_inst + + .global _tx_ev_tblmiss_data +_tx_ev_tblmiss_data: + flag 1 + nop + nop + nop + b _tx_ev_tblmiss_data + + .global _tx_ev_protection_viol +_tx_ev_protection_viol: + flag 1 + nop + nop + nop + b _tx_ev_protection_viol + + .global _tx_ev_privilege_viol +_tx_ev_privilege_viol: + flag 1 + nop + nop + nop + b _tx_ev_privilege_viol + + .global _tx_ev_software_int +_tx_ev_software_int: + flag 1 + nop + nop + nop + b _tx_ev_software_int + + .global _tx_ev_trap +_tx_ev_trap: + flag 1 + nop + nop + nop + b _tx_ev_trap + + .global _tx_ev_extension +_tx_ev_extension: + flag 1 + nop + nop + nop + b _tx_ev_extension + + .global _tx_ev_divide_by_zero +_tx_ev_divide_by_zero: + flag 1 + nop + nop + nop + b _tx_ev_divide_by_zero + + .global _tx_ev_dc_error +_tx_ev_dc_error: + flag 1 + nop + nop + nop + b _tx_ev_dc_error + + .global _tx_ev_maligned +_tx_ev_maligned: + flag 1 + nop + nop + nop + b _tx_ev_maligned + + .global _tx_unsued_0 +_tx_unsued_0: + flag 1 + nop + nop + nop + b _tx_unsued_0 + + .global _tx_unused_1 +_tx_unused_1: + flag 1 + nop + nop + nop + b _tx_unused_1 + + .global _tx_timer_0 +_tx_timer_0: +; +; /* By default, setup Timer 0 as the ThreadX timer interrupt. */ +; + sub sp, sp, 160 ; Allocate an interrupt stack frame + st r0, [sp, 0] ; Save r0 + st r1, [sp, 4] ; Save r1 + st r2, [sp, 8] ; Save r2 + mov r0, 3 + sr r0, [CONTROL0] + + b _tx_timer_interrupt ; Jump to generic ThreadX timer interrupt + ; handler +; flag 1 +; nop +; nop +; nop +; b _tx_timer_0 + + .global _tx_timer_1 +_tx_timer_1: + flag 1 + nop + nop + nop + b _tx_timer_1 + +; bl _tx_thread_context_fast_save +; mov r0, 3 +; sr r0, [CONTROL1] +; +; /* Fast ISR processing goes here. Interrupts must not be re-enabled +; in the fast interrupt mode. Also note that multiple register banks +; are available and the fast interrupt processing always maps to +; register bank 1. */ +; +; b _tx_thread_context_fast_restore + + .global _tx_undefined_0 +_tx_undefined_0: + flag 1 + nop + nop + nop + b _tx_undefined_0 + + .global _tx_undefined_1 +_tx_undefined_1: + flag 1 + nop + nop + nop + b _tx_undefined_1 + + .global _tx_undefined_2 +_tx_undefined_2: + flag 1 + nop + nop + nop + b _tx_undefined_2 + + .end diff --git a/ports/arc_hs/metaware/example_build/sample_threadx/vectors.s b/ports/arc_hs/metaware/example_build/sample_threadx/vectors.s new file mode 100644 index 00000000..c6cbc893 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/sample_threadx/vectors.s @@ -0,0 +1,29 @@ + +.file "vectors.s" +.section .ivt,text +;; This directive forces this section to stay resident even if stripped out by the -zpurgetext linker option +.sectflag .ivt,include + +;// handler's name type number name offset in IVT (hex/dec) +.long _start ; exception 0 program entry point offset 0x0 0 +.long _tx_memory_error ; exception 1 memory_error offset 0x4 4 +.long _tx_instruction_error ; exception 2 instruction_error offset 0x8 8 +.long _tx_ev_machine_check ; exception 3 EV_MachineCheck offset 0xC 12 +.long _tx_ev_tblmiss_inst ; exception 4 EV_TLBMissI offset 0x10 16 +.long _tx_ev_tblmiss_data ; exception 5 EV_TLBMissD offset 0x14 20 +.long _tx_ev_protection_viol ; exception 6 EV_ProtV offset 0x18 24 +.long _tx_ev_privilege_viol ; exception 7 EV_PrivilegeV offset 0x1C 28 +.long _tx_ev_software_int ; exception 8 EV_SWI offset 0x20 32 +.long _tx_ev_trap ; exception 9 EV_Trap offset 0x24 36 +.long _tx_ev_extension ; exception 10 EV_Extension offset 0x28 40 +.long _tx_ev_divide_by_zero ; exception 11 EV_DivZero offset 0x2C 44 +.long _tx_ev_dc_error ; exception 12 EV_DCError offset 0x30 48 +.long _tx_ev_maligned ; exception 13 EV_Maligned offset 0x34 52 +.long _tx_unsued_0 ; exception 14 unused offset 0x38 56 +.long _tx_unused_1 ; exception 15 unused offset 0x3C 60 +.long _tx_timer_0 ; IRQ 16 Timer 0 offset 0x40 64 +.long _tx_timer_1 ; IRQ 17 Timer 1 offset 0x44 68 +.long _tx_undefined_0 ; IRQ 18 offset 0x48 72 +.long _tx_undefined_1 ; IRQ 19 offset 0x4C 76 +.long _tx_undefined_2 ; IRQ 20 offset 0x50 80 + diff --git a/ports/arc_hs/metaware/example_build/tx/.cproject b/ports/arc_hs/metaware/example_build/tx/.cproject new file mode 100644 index 00000000..18edc3d5 --- /dev/null +++ b/ports/arc_hs/metaware/example_build/tx/.cproject @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/example_build/tx/.project b/ports/arc_hs/metaware/example_build/tx/.project new file mode 100644 index 00000000..863ca5cb --- /dev/null +++ b/ports/arc_hs/metaware/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml b/ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..e071d37e --- /dev/null +++ b/ports/arc_hs/metaware/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/arc_hs/metaware/inc/tx_port.h b/ports/arc_hs/metaware/inc/tx_port.h new file mode 100644 index 00000000..b531615c --- /dev/null +++ b/ports/arc_hs/metaware/inc/tx_port.h @@ -0,0 +1,338 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARC_HS/MetaWare */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Remove volatile for ThreadX source on the ARC. This is because the ARC + compiler generates different non-cache r/w access when using volatile + that is different from the assembly language access of the same + global variables in ThreadX. */ + +#ifdef TX_SOURCE_CODE +#define volatile +#else +#ifdef NX_SOURCE_CODE +#define volatile +#else +#ifdef FX_SOURCE_CODE +#define volatile +#else +#ifdef UX_SOURCE_CODE +#define volatile +#endif +#endif +#endif +#endif + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 800 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 2048 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARC HS port. */ + +#define TX_INT_ENABLE 0x0000001F /* Enable all interrupts */ +#define TX_INT_DISABLE_MASK 0x00000000 /* Disable all interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 VOID *__mw_threadx_tls; \ + int __mw_errnum; \ + VOID (*__mw_thread_exit)(struct TX_THREAD_STRUCT *); +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + +#if __HIGHC__ + +/* The MetaWare thread safe C/C++ runtime library needs space to + store thread specific information. In addition, a function pointer + is also supplied so that certain thread-specific resources may be + released upon thread termination and/or thread completion. */ + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) \ + thread_ptr -> __mw_threadx_tls = 0; \ + thread_ptr -> __mw_errnum = 0; \ + thread_ptr -> __mw_thread_exit = TX_NULL; +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) \ + if (thread_ptr -> __mw_thread_exit) \ + (thread_ptr -> __mw_thread_exit) (thread_ptr); + +#else + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _clri(); +#define TX_RESTORE _seti(interrupt_save); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define ARC HS extension for assigning a hardware register bank to a thread. Note that this API can only be + called after a thread is created from initialization. It is assumed that interrupts are disabled and the + initialization code is running in hardware register bank 0. It is also assumed that the application provides + a vaild register bank number to the API. */ + +#ifndef TX_SOURCE_CODE +#define tx_initialize_fast_interrupt_setup _tx_initialize_fast_interrupt_setup +#define tx_thread_register_bank_assign _tx_thread_register_bank_assign +#endif + +VOID tx_initialize_fast_interrupt_setup(VOID *stack_ptr); +VOID tx_thread_register_bank_assign(VOID *thread_ptr, UINT register_bank); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARC_HS/MetaWare Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/arc_hs/metaware/readme_threadx.txt b/ports/arc_hs/metaware/readme_threadx.txt new file mode 100644 index 00000000..7f7e1716 --- /dev/null +++ b/ports/arc_hs/metaware/readme_threadx.txt @@ -0,0 +1,251 @@ + Microsoft's Azure RTOS ThreadX for ARC HS + + Using the MetaWare Tools + +1. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace, which is located inside the "example_build" directory. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply select the ThreadX library project +file "tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the MetaWare ARC HS +simulation. The instructions that follow describe how to get the ThreadX +demonstration running. + +Building the demonstration is easy; simply select the demonstration project file +"sample_threadx." At this point, select the build button and observe the +compilation, assembly, and linkage of the ThreadX demonstration application. + +After the demonstration is built, click on the "Debug" button and it will +automatically launch a pre-configured connection to the ARC HS simulator. + +You are now ready to execute the ThreadX demonstration system. Select +breakpoints and data watches to observe the execution of the sample_threadx.c +application. + + +4. System Initialization + +The system entry point using the MetaWare tools is at the label _start. +This is defined within the crt1.s file supplied by MetaWare. In addition, +this is where all static and global preset C variable initialization +processing is called from. + +After the MetaWare startup function completes, ThreadX initialization is +called. The main initialization function is _tx_initialize_low_level and +is located in the file tx_initialize_low_level.s. This function is +responsible for setting up various system data structures, and interrupt +vectors. + +By default free memory is assumed to start at the section .free_memory +which is referenced in tx_initialize_low_level.s and located in the +linker control file after all the linker defined RAM addresses. This is +the address passed to the application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The ARC compiler assumes that registers r0-r12 are scratch registers for +each function. All other registers used by a C function must be preserved +by the function. ThreadX takes advantage of this in situations where a +context switch happens as a result of making a ThreadX service call (which +is itself a C function). In such cases, the saved context of a thread is +only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 LP_START blink + 0x08 LP_END fp + 0x0C LP_COUNT r26 + 0x10 blink r25 + 0x14 ilink r24 + 0x18 fp r23 + 0x1C r26 r22 + 0x20 r25 r21 + 0x24 r24 r20 + 0x28 r23 r19 + 0x2C r22 r18 + 0x30 r21 r17 + 0x34 r20 r16 + 0x38 r19 r15 + 0x3C r18 r14 + 0x40 r17 r13 + 0x44 r16 STATUS32 + 0x48 r15 r30 + 0x4C r14 + 0x50 r13 + 0x54 r12 + 0x58 r11 + 0x5C r10 + 0x60 r9 + 0x64 r8 + 0x68 r7 + 0x6C r6 + 0x70 r5 + 0x74 r4 + 0x78 r3 + 0x7C r2 + 0x80 r1 + 0x84 r0 + 0x88 r30 + 0x8C reserved + 0x90 reserved + 0x94 reserved + 0x98 reserved + 0x9C bta + 0xA0 point of interrupt + 0xA4 STATUS32 + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat +file to remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for the +ARC HS processor, including support for software interrupts and fast +hardware interrupts. + +7.1 Software Interrupt Handling + +The following template should be used for software interrupts +managed by ThreadX: + + .global _tx_interrupt_x +_tx_interrupt_x: + sub sp, sp, 160 ; Allocate an interrupt stack frame + st blink, [sp, 16] ; Save blink (blink must be saved before _tx_thread_context_save) + bl _tx_thread_context_save ; Save interrupt context +; +; /* Application ISR processing goes here! Your ISR can be written in +; assembly language or in C. If it is written in C, you must allocate +; 16 bytes of stack space before it is called. This must also be +; recovered once your C ISR return. An example of this is shown below. +; +; If the ISR is written in assembly language, only the compiler scratch +; registers are available for use without saving/restoring (r0-r12). +; If use of additional registers are required they must be saved and +; restored. */ +; + bl.d your_ISR_written_in_C ; Call an ISR written in C + sub sp, sp, 16 ; Allocate stack space (delay slot) + add sp, sp, 16 ; Recover stack space + +; + b _tx_thread_context_restore ; Restore interrupt context + + +The application handles interrupts directly, which necessitates all register +preservation by the application's ISR. ISRs that do not use the ThreadX +_tx_thread_context_save and _tx_thread_context_restore routines are not +allowed access to the ThreadX API. In addition, custom application ISRs +should be higher priority than all ThreadX-managed ISRs. + +7.2 Fast Interrupt Handling + +ThreadX supports the ARC HS fast interrupt processing. It is assumed that +multiple register banks are available and the ARC HS processor automatically +uses register bank 1 as the fast interrupt register bank. + +In order to use fast interrupts with register bank 1, the interrupt desired +must have priority 0 and the application must call the following ThreadX API +to setup register bank 1: + +void tx_initialize_fast_interrupt_setup(void *stack_ptr); + +The parameter "stack_ptr" is the first usable address for the fast interrupt +stack. For example, assume the fast interrupt stack is to be located in the +array "unsigned char fast_interrupt_stack[1024]" the call to this API would +look like: + + tx_initialize_fast_interrupt_setup(&fast_interrupt_stack[1020]); + +As for the fast interrupt ISR, the following template should be used for +ARC HS fast interrupts managed by ThreadX: + + .global _tx_fast_interrupt_x +_tx_fast_interrupt_x: + bl _tx_thread_context_fast_save +; +; /* Fast ISR processing goes here. Interrupts must not be re-enabled +; in the fast interrupt mode. Also note that multiple register banks +; are available and the fast interrupt processing always maps to +; register bank 1. */ +; + b _tx_thread_context_fast_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +By default, the ThreadX timer interrupt is mapped to the ARC HS auxiliary +timer 0, which generates low priority interrupts on interrupt vector 16. +It is easy to change the timer interrupt source and priority by changing the +setup code in tx_initialize_low_level.s. + + +9. Thread Hardware Register Bank Context + +ThreadX supports the use of hardware register banks on the ARC HS. A hardware +register bank may be associated with a specific application thread via the +following API: + +void tx_thread_register_bank_assign(TX_THREAD *thread_ptr, register_bank); + +This API is assumed to be called from initialization (interrupts are locked out +and execution is from register bank 0) and after the specified thread has been +created. This API assumes the register bank number is correct, i.e., a valid +register bank greater than 0 and one that hasn't been used for another thread. + +Note: if fast interrupts are used, register bank 1 must also not be used. In this +case the valid register bank range is 2 through maximum register banks minus 1. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 for ARC HS using MetaWare tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s b/ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s new file mode 100644 index 00000000..4effd106 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_initialize_fast_interrupt_setup.s @@ -0,0 +1,107 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_fast_interrupt_setup ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function initializes register bank 1 for fast interrupt use. */ +;/* The initialization includes setting the stack pointer to the value */ +;/* supplied by the caller. */ +;/* */ +;/* INPUT */ +;/* */ +;/* stack_ptr Pointer to stack for bank 1 */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_fast_interrupt_setup(VOID *stack_ptr) +;{ + .global _tx_initialize_fast_interrupt_setup + .type _tx_initialize_fast_interrupt_setup, @function +_tx_initialize_fast_interrupt_setup: +; +; /* Assume this routine is being called from initialization, with interrupts +; disabled and from register bank 0. Also assume that the stack pointer +; input is valid, i.e., there is no error checking on the validity of +; register_bank. */ +; + sub sp, sp, 8 ; Build a small stack frame to hold the setup information + st gp, [sp, 0] ; Save gp in the frame + st r0, [sp, 4] ; Save sp in the frame + mov ilink, sp ; Move the stack frame into ilink + mov r1, 1 ; Select register bank 1 + asl r2, r1, 16 ; Move the register bank bits over to proper location + lr r3, [status32] ; Pickup status32 register + or r3, r3, r2 ; Build new status32 register + kflag r3 ; Move to the hardware register bank + mov r0, ilink ; Place stack pointer in r0 + ld sp, [r0, 4] ; Setup stack pointer for this hardware register bank + mov fp, 0 ; Setup fp + ld gp, [r0, 0] ; Setup gp + mov blink, 0 ; Setup blink + mov r0, 0 ; Clear r0 + sub sp, sp, 8 ; Reserve space for saving ilink and status32.p0 on thread preemption + lr r3, [status32] ; Pickup status32 register + bclr r3, r3, 16 ; Build register bank 0 value + bclr r3, r3, 17 ; + bclr r3, r3, 18 ; + kflag r3 ; Move back to register bank 0 + j_s.d [blink] ; Return to caller + add sp, sp, 8 ; +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s b/ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s new file mode 100644 index 00000000..9b5e71b2 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_fast_restore.s @@ -0,0 +1,303 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_fast_restore ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fast interrupt context, which can be a */ +;/* nesting condition on a non-fast ISR, an idle system restore, a */ +;/* restore of an interrupted thread, and a preemption of an interrupted*/ +;/* thread. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_fast_restore(VOID) +;{ + + .global _tx_thread_context_fast_restore + .type _tx_thread_context_fast_restore, @function +_tx_thread_context_fast_restore: +; +; /* Note: it is assumed that the stack pointer is in the same position now as +; it was after the last context fast save call. */ +; + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + bl.d _tx_execution_isr_exit ; Call the ISR exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state contents + sub r0, r0, 1 ; Decrement the system state + st r0, [gp, _tx_thread_system_state@sda] ; Store the new system state + breq r0, 0, __tx_thread_not_nested_restore ; If zero, not a nested interrupt +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + +__tx_thread_nested_restore: + rtie ; Return from interrupt +; +; +; } +__tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + ld r2, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable flag + sub.f 0, r0, 0 ; Set condition codes + beq.d __tx_thread_idle_system_restore ; If NULL, idle system was interrupted + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + brne.d r4, r5, __tx_thread_no_preempt_restore ; If more interrupts, just return to the point of interrupt + ld r4, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + brne r2, 0, __tx_thread_no_preempt_restore ; If set, don't preempt executing thread + brne r0, r4, __tx_thread_preempt_restore ; Not equal, preempt executing thread +; +; +__tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Return to the point of interrupt. */ +; + rtie ; Return from interrupt +; +; } +; else +; { +__tx_thread_preempt_restore: +; + lr r3, [status32_p0] ; Pickup the interrupted status32.p0 register + lsr r4, r3, 16 ; Move the register bank bits down + and r4, r4, 7 ; Isolate the register bank + breq r4, 0, __tx_software_interrupt_context ; If register bank 0, software interrupt context is present + st ilink, [sp, 0] ; Save ilink (point of interrupt) + st r3, [sp, 4] ; Save actual status32.p0 + bclr r4, r3, 16 ; Build register bank 0 value + bclr r4, r4, 17 ; + bclr r4, r4, 18 ; + sr r4, [status32_p0] ; Setup status32.p0 to return to bank 0 when fast ISR is finishe + mov ilink, sp ; Pass the information back to the other register bank via ilink + bclr r3, r3, 31 ; Make sure interrupts are not enabled + kflag r3 ; Switch back to the interrupted thread's hardware register bank + sub sp, sp, 168 ; Allocate an hardware interrupt stack frame + st r0, [sp, 132] ; Temporarily save r0 + mov r0, 3 ; Build hardware interrupt stack type + st r0, [sp, 0] ; Setup interrupt stack type + + .ifndef TX_DISABLE_LP + lr r0, [LP_START] ; Pickup LP_START + st r0, [sp, 4] ; Save LP_START + lr r0, [LP_END] ; Pickup LP_END + st r0, [sp, 8] ; Save LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + .endif + + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + ld r0, [ilink, 0] ; Pickup the point of interrupt + st r0, [sp, 160] ; Setup the point of interrupt + st r0, [sp, 20] ; Save ilink + ld r0, [ilink, 4] ; Pickup the status32 + st r0, [sp, 164] ; Setup the status32 + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st sp, [r0, 8] ; Save stack pointer in thread control block + ld r0, [sp, 132] ; Restore r0 + lr ilink, [status32] ; Pickup status32 register + bset ilink, ilink, 16 ; Build register bank 1 value + bclr ilink, ilink, 17 ; + bclr ilink, ilink, 18 ; + kflag ilink ; Move back to register bank 0 + b __tx_preempt_save_done ; Done, finished with preemption save + +__tx_software_interrupt_context: + st ilink, [sp, 0] ; Save ilink (point of interrupt) + st r3, [sp, 4] ; Save status32 + mov ilink, sp ; Pass the information back to the other register bank via ilink + bclr r3, r3, 31 ; Make sure interrupts are not enabled + kflag r3 ; Switch back to the interrupted thread's hardware register bank + sub sp, sp, 168 ; Allocate an hardware interrupt stack frame + st blink, [sp, 16] ; Save blink + st fp, [sp, 24] ; Save fp + st gp, [sp, 28] ; Save gp + st r25, [sp, 32] ; Save r25 + st r24, [sp, 36] ; Save r24 + st r23, [sp, 40] ; Save r23 + st r22, [sp, 44] ; Save r22 + st r21, [sp, 48] ; Save r21 + st r20, [sp, 52] ; Save r20 + st r19, [sp, 56] ; Save r19 + st r18, [sp, 60] ; Save r18 + st r17, [sp, 64] ; Save r17 + st r16, [sp, 68] ; Save r16 + st r15, [sp, 72] ; Save r15 + st r14, [sp, 76] ; Save r14 + st r13, [sp, 80] ; Save r13 + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r6 + st r3, [sp, 120] ; Save r3 + st r2, [sp, 124] ; Save r2 + st r1, [sp, 128] ; Save r1 + st r0, [sp, 132] ; Save r0 + st r30, [sp, 136] ; Save r30 + + .ifndef TX_DISABLE_LP + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + .endif + + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + mov r6, 1 ; Build interrupt stack type + st r6, [sp, 0] ; Setup interrupt stack type + ld r0, [ilink, 0] ; Pickup the point of interrupt + st r0, [sp, 160] ; Setup the point of interrupt + st r0, [sp, 20] ; Save ilink + ld r0, [ilink, 4] ; Pickup the status32 + st r0, [sp, 164] ; Setup the status32 + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st sp, [r0, 8] ; Save stack pointer in thread control block + lr ilink, [status32] ; Pickup status32 register + bset ilink, ilink, 16 ; Build register bank 1 value + bclr ilink, ilink, 17 ; + bclr ilink, ilink, 18 ; + kflag ilink ; Move back to register bank 1 +__tx_preempt_save_done: +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup time-slice contents + mov r7, 0 ; Build clear/NULL value + breq r2, 0, __tx_thread_dont_save_ts ; No time-slice, don't need to save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r2, [r0, 24] ; If set, save remaining time-slice + st r7, [gp, _tx_timer_time_slice@sda] ; If set, clear time slice +; +; } +__tx_thread_dont_save_ts: +; +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + st r7, [gp, _tx_thread_current_ptr@sda] ; Set current thread ptr to NULL + mov ilink, _tx_thread_schedule ; Build address of scheduler + rtie ; Return from interrupt to scheduler +; +; } +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; +__tx_thread_idle_system_restore: + + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + sub.f 0, r4, r5 ; Set condition codes + bne __tx_thread_nested_restore ; If more interrupts, just return to the point of interrupt + + mov ilink, _tx_thread_schedule ; Build address of scheduler + rtie ; Return from interrupt to scheduler +; +;} + .end + diff --git a/ports/arc_hs/metaware/src/tx_thread_context_fast_save.s b/ports/arc_hs/metaware/src/tx_thread_context_fast_save.s new file mode 100644 index 00000000..c25f39bb --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_fast_save.s @@ -0,0 +1,108 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_fast_save ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of fast interrupt processing. The function assumes that */ +;/* fast interrupts are enabled (priority 0) and multiple register */ +;/* banks are available. In this case, register bank 1 is reserved by */ +;/* hardware for fast interrupts. Additional assumptions include that */ +;/* there will be no nested fast interrupts and the LP_START, LP_END, */ +;/* and LP_COUNT registers are not used in the application's fast */ +;/* interrupt ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_fast_save(VOID) +;{ + .global _tx_thread_context_fast_save + .type _tx_thread_context_fast_save, @function +_tx_thread_context_fast_save: +; +; /* Increment nested interrupt count. */ +; _tx_thread_system_state++; +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state +; +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; + + j [blink] ; Return to the ISR +; +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_context_restore.s b/ports/arc_hs/metaware/src/tx_thread_context_restore.s new file mode 100644 index 00000000..497aec43 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_restore.s @@ -0,0 +1,322 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, @function +_tx_thread_context_restore: +; +; /* Note: it is assumed that the stack pointer is in the same position now as +; it was after the last context save call. */ +; +; /* Lockout interrupts. */ +; + clri ; Disable interrupts + nop ; Delay for interrupts to really be disabled + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + bl.d _tx_execution_isr_exit ; Call the ISR exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state contents + sub r0, r0, 1 ; Decrement the system state + st r0, [gp, _tx_thread_system_state@sda] ; Store the new system state + breq r0, 0, __tx_thread_not_nested_restore ; If zero, not a nested interrupt +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + +__tx_thread_nested_restore: + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; +; } +__tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + ld r2, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable flag + sub.f 0, r0, 0 ; Set condition codes + beq.d __tx_thread_idle_system_restore ; If NULL, idle system was interrupted + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + brne.d r4, r5, __tx_thread_no_preempt_restore ; If more interrupts, just return to the point of interrupt + ld r4, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + brne r2, 0, __tx_thread_no_preempt_restore ; If set, don't preempt executing thread + brne r0, r4, __tx_thread_preempt_restore ; Not equal, preempt executing thread +; +; +__tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; + +; /* Recover the saved context and return to the point of interrupt. */ +; + ld sp, [r0, 8] ; Switch back to thread's stack + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + ld r2, [sp, 156] ; Pickup BTA + sr r2, [BTA] ; Recover BTA + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return from interrupt +; +; } +; else +; { +__tx_thread_preempt_restore: +; + ld r7, [r0, 8] ; Pickup stack pointer + lr r3, [status32] ; Pickup the status32 register + lsr r4, r3, 16 ; Move the register bank bits down + and r4, r4, 7 ; Isolate the register bank + breq r4, 0, __tx_software_interrupt_context ; If register bank 0, software interrupt context is present + mov sp, r7 ; Setup sp in this register bank + mov r6, 3 ; Build hardware interrupt stack type + st r6, [sp, 0] ; Setup interrupt stack type + ld blink, [sp, 16] ; Recover blink + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + lr ilink, [status32] ; Pickup status32 register + bclr ilink, ilink, 16 ; Build register bank 0 value + bclr ilink, ilink, 17 ; + bclr ilink, ilink, 18 ; + kflag ilink ; Move back to register bank 0 + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + b __tx_preempt_save_done ; Done, finished with preemption save + nop + +__tx_software_interrupt_context: + mov r6, 1 ; Build interrupt stack type + st r6, [r7, 0] ; Setup interrupt stack type + st fp, [r7, 24] ; Save fp + st gp, [r7, 28] ; Save gp + st r25, [r7, 32] ; Save r25 + st r24, [r7, 36] ; Save r24 + st r23, [r7, 40] ; Save r23 + st r22, [r7, 44] ; Save r22 + st r21, [r7, 48] ; Save r21 + st r20, [r7, 52] ; Save r20 + st r19, [r7, 56] ; Save r19 + st r18, [r7, 60] ; Save r18 + st r17, [r7, 64] ; Save r17 + st r16, [r7, 68] ; Save r16 + st r15, [r7, 72] ; Save r15 + st r14, [r7, 76] ; Save r14 + st r13, [r7, 80] ; Save r13 + st r30, [r7, 136] ; Save r30 +__tx_preempt_save_done: +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup time-slice contents + mov r7, 0 ; Build clear/NULL value + breq r2, 0, __tx_thread_dont_save_ts ; No time-slice, don't need to save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r2, [r0, 24] ; If set, save remaining time-slice + st r7, [gp, _tx_timer_time_slice@sda] ; If set, clear time slice +; +; } +__tx_thread_dont_save_ts: +; +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + st r7, [gp, _tx_thread_current_ptr@sda] ; Set current thread ptr to NULL + + sub sp, sp, 8 ; Allocate a small stack frame on the system stack + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +; } +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; +__tx_thread_idle_system_restore: + + lr r4, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r5, r4 ; Negate + and r5, r4, r5 ; See if there are any other interrupts present + sub.f 0, r4, r5 ; Set condition codes + bne __tx_thread_nested_restore ; If more interrupts, just return to the point of interrupt + + lr r0, [STATUS32] ; Pickup STATUS32 + st r0, [sp, 4] ; Place on stack + mov r0, _tx_thread_schedule ; Build address of scheduler + st r0, [sp, 0] ; Write over the point of interrupt + rtie ; Return from interrupt to scheduler +; +;} + .end + diff --git a/ports/arc_hs/metaware/src/tx_thread_context_save.s b/ports/arc_hs/metaware/src/tx_thread_context_save.s new file mode 100644 index 00000000..b24cc042 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_context_save.s @@ -0,0 +1,242 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + .global _tx_thread_context_save + .type _tx_thread_context_save, @function +_tx_thread_context_save: +; +; /* Upon entry to this routine, it is assumed that an interrupt stack frame +; has already been allocated, and the interrupted blink register is already saved. */ +; + clri ; Disable interrupts + st r1, [sp, 128] ; Save r1 + st r0, [sp, 132] ; Save r0 +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + ld r0, [gp, _tx_thread_system_state@sda] ; Pickup system state + st r3, [sp, 120] ; Save r3 + st r2, [sp, 124] ; Save r2 + breq r0, 0, __tx_thread_not_nested_save ; If 0, we are not in a nested + ; condition +; +; /* Nested interrupt condition. */ +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; +__tx_thread_nested_save: ; Label is for special nested interrupt case from idle system save below + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r6 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA + +; +; /* Return to the ISR. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; + + j.d [blink] ; Return to Level 1 ISR + st ilink, [sp, 20] ; Save ilink +; +__tx_thread_not_nested_save: +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + add r0, r0, 1 ; Increment the nested interrupt count + st r0, [gp, _tx_thread_system_state@sda] ; Update system state + ld r1, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread pointer + st r12, [sp, 84] ; Save r12 + st r11, [sp, 88] ; Save r11 + breq r1, 0, __tx_thread_idle_system_save ; If no thread is running, idle system was + ; interrupted. +; +; /* Save minimal context of interrupted thread. */ +; + st r10, [sp, 92] ; Save r10 + st r9, [sp, 96] ; Save r9 + st r8, [sp, 100] ; Save r8 + st r7, [sp, 104] ; Save r7 + st r6, [sp, 108] ; Save r6 + st r5, [sp, 112] ; Save r5 + st r4, [sp, 116] ; Save r4 + lr r10, [LP_START] ; Pickup LP_START + lr r9, [LP_END] ; Pickup LP_END + st LP_COUNT, [sp, 12] ; Save LP_COUNT + st r10, [sp, 4] ; Save LP_START + st r9, [sp, 8] ; Save LP_END + st ilink, [sp, 20] ; Save ilink + .ifdef TX_ENABLE_ACC + st r58, [sp, 140] ; Save r58 + st r59, [sp, 144] ; Save r59 + .endif + lr r0, [BTA] ; Pickup BTA + st r0, [sp, 156] ; Save BTA +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; + st sp, [r1, 8] ; Save thread's stack pointer + + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + j_s.d [blink] ; Return to calling ISR + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack +; +; } +; else +; { +; +__tx_thread_idle_system_save: +; +; /* Interrupt occurred in the scheduling loop. */ +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + sub sp, sp, 32 ; Allocating some space on the stack + st blink, [sp, 16] ; Save blink + bl.d _tx_execution_isr_enter ; Call the ISR enter function + nop ; Delay slot + ld blink, [sp, 16] ; Recover blink + add sp, sp, 32 ; Recover the stack space + .endif +; +; /* See if we have a special nesting condition. This happens when the higher priority +; interrupt occurs before the nested interrupt logic is valid. */ +; + lr r0, [AUX_IRQ_ACT] ; Pickup the interrupt active register + neg r1, r0 ; Negate + and r1, r0, r1 ; See if there are any other interrupts present + brne r0, r1, __tx_thread_nested_save ; If more interrupts, go into the nested interrupt save logic +; +; /* Not much to do here, just adjust the stack pointer, and return to +; ISR processing. */ +; + j_s.d [blink] ; Return to ISR + add sp, sp, 160 ; Recover stack space +; +; } +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_interrupt_control.s b/ports/arc_hs/metaware/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..cfa6221b --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_interrupt_control.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, @function +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + clri r1 ; Get current interrupt state +; +; /* Apply the new interrupt posture. */ +; + seti r0 ; Set desired interrupt state + j_s.d [blink] ; Return to caller with delay slot + mov r0, r1 ; Return previous mask value. Return value is TX_INT_DISABLE or TX_INT_ENABLE. +; +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s b/ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s new file mode 100644 index 00000000..172a7f31 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_register_bank_assign.s @@ -0,0 +1,113 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_register_bank_assign ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* register_bank Register bank number */ +;/* (1 through max-1) */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_register_bank_assign(VOID *thread_ptr, UINT register_bank) +;{ + .global _tx_thread_register_bank_assign + .type _tx_thread_register_bank_assign, @function +_tx_thread_register_bank_assign: +; +; /* Assume this routine is being called from initialization, with interrupts +; disabled and from register bank 0. Also assume that the thread pointer and +; register bank input is valid, i.e., there is no error checking on the validity of +; the thread pointer or the register_bank. +; +; It is worth noting that if fast interrupts are being used, register bank 1 +; is reserved for the fast interrupt processing, so thread register bank assignments +; should begin at bank 2. */ +; + mov ilink, r0 ; Move the thread control block into ilink + asl r2, r1, 16 ; Move the register bank bits over to proper location + lr r3, [status32] ; Pickup status32 register + or r3, r3, r2 ; Build new status32 register + ld r4, [r0, 8] ; Pickup stack pointer for the thread + ld r5, [r4, 164] ; Pickup initial status32 from stack area + or r5, r5, r2 ; Modify initial status32 with register bank number + st r5, [r4, 164] ; Store initial status32 in stack area + kflag r3 ; Move to the hardware register bank + mov r0, ilink ; Place thread control block in r0 + ld sp, [r0, 8] ; Setup stack pointer for this hardware register bank + ld fp, [sp, 24] ; Setup fp + ld gp, [sp, 28] ; Setup gp + ld blink, [sp, 16] ; Setup blink + ld ilink, [sp, 20] ; Setup ilink + lr r3, [status32] ; Pickup status32 register + bclr r3, r3, 16 ; Build register bank 0 value + bclr r3, r3, 17 ; + bclr r3, r3, 18 ; + kflag r3 ; Move back to register bank 0 + mov r5, 3 ; Build type for hardware interrupt context + j_s.d [blink] ; Return to caller + st r5, [r4, 0] ; Set stack frame type +;} + .end diff --git a/ports/arc_hs/metaware/src/tx_thread_schedule.s b/ports/arc_hs/metaware/src/tx_thread_schedule.s new file mode 100644 index 00000000..7560e34f --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_schedule.s @@ -0,0 +1,265 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; + .equ BTA, 0x412 +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + .global _tx_thread_schedule + .type _tx_thread_schedule, @function +_tx_thread_schedule: +; +; /* Switch to system stack. */ +; + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack +; +; /* Enable interrupts. */ +; + mov r0, 0x1F ; Build enable interrupt value + seti r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { +; +__tx_thread_schedule_loop: +; + ld r0, [gp, _tx_thread_execute_ptr@sda] ; Pickup next thread to execute + breq r0, 0, __tx_thread_schedule_loop ; If NULL, keep looking +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + clri ; Lockout interrupts + nop ; Delay for interrupts to really be disabled +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + st r0, [gp, _tx_thread_current_ptr@sda] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + ld r3, [r0, 4] ; Pickup run counter + ld r4, [r0, 24] ; Pickup time-slice for this thread + add r3, r3, 1 ; Increment run counter + st r3, [r0, 4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + st r4, [gp, _tx_timer_time_slice@sda] ; Setup time-slice +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + bl.d _tx_execution_thread_enter ; Call the thread execution enter function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + .endif +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + ld sp, [r0, 8] ; Switch to thread's stack + ld r1, [sp, 0] ; Pickup stack type + brlt r1, 2, __tx_restore_non_hw_context ; If less than 2, restore a software context + breq r1, 3, __tx_hw_interrupt_restore ; If interrupt restore, restore interrupted hardware context + ld r2, [sp, 4] ; Pickup status32 + kflag r2 ; Enter the proper register bank + ld r3, [sp, 8] ; Pickup the saved interrupt posture + add sp, sp, 12 ; Recover small stack frame + j_s.d [blink] ; Return to thread and restore flags + seti r3 ; Recover STATUS32 + +__tx_hw_interrupt_restore: + + mov r0, 0x2 ; Pretend level 1 interrupt is returning + sr r0, [AUX_IRQ_ACT] ; + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + + ld r0, [sp, 156] ; Pickup saved BTA + sr r0, [BTA] ; Recover BTA + ld ilink, [sp, 20] ; Recover ilink + ld r0, [sp, 164] ; Pickup the interrupted status32 + bclr r0, r0, 31 ; Make sure interrupts are not enabled + kflag r0 ; Switch to the proper register bank + add sp, sp, 160 ; Recover the interrupt stack frame + rtie ; Return to point of interrupt + +__tx_restore_non_hw_context: +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + ld r1, [sp, 0] ; Pickup the stack type + brne r1, 0, __tx_thread_schedule_int_ret ; Compare to solicited stack type. If not, thread was interrupted + ld blink, [sp, 4] ; Recover blink + ld fp, [sp, 8] ; Recover fp + ld gp, [sp, 12] ; Recover gp + ld r25, [sp, 16] ; Recover r25 + ld r24, [sp, 20] ; Recover r24 + ld r23, [sp, 24] ; Recover r23 + ld r22, [sp, 28] ; Recover r22 + ld r21, [sp, 32] ; Recover r21 + ld r20, [sp, 36] ; Recover r20 + ld r19, [sp, 40] ; Recover r19 + ld r18, [sp, 44] ; Recover r18 + ld r17, [sp, 48] ; Recover r17 + ld r16, [sp, 52] ; Recover r16 + ld r15, [sp, 56] ; Recover r15 + ld r14, [sp, 60] ; Recover r14 + ld r13, [sp, 64] ; Recover r13 + ld r1, [sp, 68] ; Pickup status32 + ld r30, [sp, 72] ; Recover r30 + add sp, sp, 76 ; Recover solicited stack frame + j_s.d [blink] ; Return to thread and restore flags + seti r1 ; Recover STATUS32 +; +__tx_thread_schedule_int_ret: +; + mov r0, 0x2 ; Pretend level 1 interrupt is returning + sr r0, [AUX_IRQ_ACT] ; + + .ifndef TX_DISABLE_LP + ld r0, [sp, 4] ; Recover LP_START + sr r0, [LP_START] ; Restore LP_START + ld r1, [sp, 8] ; Recover LP_END + sr r1, [LP_END] ; Restore LP_END + ld r2, [sp, 12] ; Recover LP_COUNT + mov LP_COUNT, r2 + .endif + + ld r0, [sp, 156] ; Pickup saved BTA + sr r0, [BTA] ; Recover BTA + ld blink, [sp, 16] ; Recover blink + ld ilink, [sp, 20] ; Recover ilink + ld fp, [sp, 24] ; Recover fp + ld gp, [sp, 28] ; Recover gp + ld r25, [sp, 32] ; Recover r25 + ld r24, [sp, 36] ; Recover r24 + ld r23, [sp, 40] ; Recover r23 + ld r22, [sp, 44] ; Recover r22 + ld r21, [sp, 48] ; Recover r21 + ld r20, [sp, 52] ; Recover r20 + ld r19, [sp, 56] ; Recover r19 + ld r18, [sp, 60] ; Recover r18 + ld r17, [sp, 64] ; Recover r17 + ld r16, [sp, 68] ; Recover r16 + ld r15, [sp, 72] ; Recover r15 + ld r14, [sp, 76] ; Recover r14 + ld r13, [sp, 80] ; Recover r13 + ld r12, [sp, 84] ; Recover r12 + ld r11, [sp, 88] ; Recover r11 + ld r10, [sp, 92] ; Recover r10 + ld r9, [sp, 96] ; Recover r9 + ld r8, [sp, 100] ; Recover r8 + ld r7, [sp, 104] ; Recover r7 + ld r6, [sp, 108] ; Recover r6 + ld r5, [sp, 112] ; Recover r5 + ld r4, [sp, 116] ; Recover r4 + ld r3, [sp, 120] ; Recover r3 + ld r2, [sp, 124] ; Recover r2 + ld r1, [sp, 128] ; Recover r1 + ld r0, [sp, 132] ; Recover r0 + ld r30, [sp, 136] ; Recover r30 + .ifdef TX_ENABLE_ACC + ld r58, [sp, 140] ; Recover r58 + ld r59, [sp, 144] ; Recover r59 + .endif + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt +; +;} +; + .end + diff --git a/ports/arc_hs/metaware/src/tx_thread_stack_build.s b/ports/arc_hs/metaware/src/tx_thread_stack_build.s new file mode 100644 index 00000000..4562db37 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_stack_build.s @@ -0,0 +1,205 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + .equ LONG_ALIGN_MASK, 0xFFFFFFFC + .equ INT_ENABLE_BITS, 0x8000001E +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, @function +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARC HS should look like the following after it is built. +; Note that the extension registers are always assigned space here. +; +; Stack Top: 1 Interrupt stack frame type +; LP_START Initial loop start +; LP_END Initial loop end +; LP_COUNT Initial loop count +; blink Initial blink value +; ilink Initial ilink (point of interrupt) +; fp (r27) Initial fp (0) +; gp Initial gp +; r25 Initial r25 +; r24 Initial r24 +; r23 Initial r23 +; r22 Initial r22 +; r21 Initial r21 +; r20 Initial r20 +; r19 Initial r19 +; r18 Initial r18 +; r17 Initial r17 +; r16 Initial r16 +; r15 Initial r15 +; r14 Initial r14 +; r13 Initial r13 +; r12 Initial r12 +; r11 Initial r11 +; r10 Initial r10 +; r9 Initial r9 +; r8 Initial r8 +; r7 Initial r7 +; r6 Initial r6 +; r5 Initial r5 +; r4 Initial r4 +; r3 Initial r3 +; r2 Initial r2 +; r1 Initial r1 +; r0 Initial r0 +; r30 Initial r30 +; r58 Initial r58 +; r59 Initial r59 +; 0 Reserved +; 0 Reserved +; 0 Initial BTA +; 0 Point of Interrupt (thread entry point) +; 0 Initial STATUS32 +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; 0 Backtrace +; +; *: these registers will only be saved and restored if flag -Xxmac_d16 is passed to hcac +; +; Stack Bottom: (higher memory address) */ +; + ld r3, [r0, 16] ; Pickup end of stack area + and r3, r3, LONG_ALIGN_MASK ; Ensure long-word alignment + sub r3, r3, 196 ; Allocate an interrupt stack frame (ARC HS) +; +; /* Actually build the stack frame. */ +; + st 1, [r3, 0] ; Store interrupt stack type on the + ; top of the stack + mov r5, 0 ; Build initial clear value + st r5, [r3, 4] ; Store initial LP_START + st r5, [r3, 8] ; Store initial LP_END + st r5, [r3, 12] ; Store initial LP_COUNT + st r5, [r3, 16] ; Store initial blink + st r1, [r3, 20] ; Store initial ilink + st r5, [r3, 24] ; Store initial fp (0 for backtrace) + st gp, [r3, 28] ; Store current gp + st r5, [r3, 32] ; Store initial r25 + st r5, [r3, 36] ; Store initial r24 + st r5, [r3, 40] ; Store initial r23 + st r5, [r3, 44] ; Store initial r22 + st r5, [r3, 48] ; Store initial r21 + st r5, [r3, 52] ; Store initial r20 + st r5, [r3, 56] ; Store initial r19 + st r5, [r3, 60] ; Store initial r18 + st r5, [r3, 64] ; Store initial r17 + st r5, [r3, 68] ; Store initial r16 + st r5, [r3, 72] ; Store initial r15 + st r5, [r3, 76] ; Store initial r14 + st r5, [r3, 80] ; Store initial r13 + st r5, [r3, 84] ; Store initial r12 + st r5, [r3, 88] ; Store initial r11 + st r5, [r3, 92] ; Store initial r10 + st r5, [r3, 96] ; Store initial r9 + st r5, [r3, 100] ; Store initial r8 + st r5, [r3, 104] ; Store initial r7 + st r5, [r3, 108] ; Store initial r6 + st r5, [r3, 112] ; Store initial r5 + st r5, [r3, 116] ; Store initial r4 + st r5, [r3, 120] ; Store initial r3 + st r5, [r3, 124] ; Store initial r2 + st r5, [r3, 128] ; Store initial r1 + st r5, [r3, 132] ; Store initial r0 + st r5, [r3, 136] ; Store initial r30 + st r5, [r3, 140] ; Store initial r58 + st r5, [r3, 144] ; Store initial r59 + st r5, [r3, 148] ; Reserved + st r5, [r3, 152] ; Reserved + st r5, [r3, 156] ; Store initial BTA + st r1, [r3, 160] ; Store initial point of entry + lr r6, [status32] ; Pickup STATUS32 + or r6, r6, INT_ENABLE_BITS ; Make sure interrupts are enabled + st r6, [r3, 164] ; Store initial STATUS32 + st r5, [r3, 168] ; Backtrace 0 + st r5, [r3, 172] ; Backtrace 0 + st r5, [r3, 176] ; Backtrace 0 + st r5, [r3, 180] ; Backtrace 0 +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r3; +; + j_s.d [blink] ; Return to caller + st r3, [r0, 8] ; Save stack pointer in thread's + ; control block +;} + .end + + diff --git a/ports/arc_hs/metaware/src/tx_thread_system_return.s b/ports/arc_hs/metaware/src/tx_thread_system_return.s new file mode 100644 index 00000000..7d661965 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_thread_system_return.s @@ -0,0 +1,169 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + .global _tx_thread_system_return + .type _tx_thread_system_return, @function +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; +; /* Lockout interrupts. */ +; + clri r2 ; Disable interrupts + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + lr r3, [status32] ; Pickup the status32 register + lsr r4, r3, 16 ; Move the register bank bits down + and r4, r4, 7 ; Isolate the register bank + breq r4, 0, __tx_software_context ; If register bank 0, software context is present + sub sp, sp, 12 ; Build small stack frame + mov r4, 2 ; Build solicited hardward stack frame type + st r4, [sp, 0] ; Set stack frame type + st r3, [sp, 4] ; Save status32 + st r2, [sp, 8] ; Save interrupt posture + st sp, [r0, 8] ; Save thread's stack pointer + bclr r3, r3, 16 ; Build register bank 0 value + bclr r3, r3, 17 ; + bclr r3, r3, 18 ; + kflag r3 ; Move back to register bank 0 + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + b.d __tx_save_done + mov r3, 0 ; Build clear value +__tx_software_context: + sub sp, sp, 76 ; Allocate a solicited stack frame + mov r3, 0 ; Build a solicited stack type + st r3, [sp, 0] ; Store stack type on the top + st blink, [sp, 4] ; Save return address and flags + st fp, [sp, 8] ; Save fp + st r26, [sp, 12] ; Save r26 + st r25, [sp, 16] ; Save r25 + st r24, [sp, 20] ; Save r24 + st r23, [sp, 24] ; Save r23 + st r22, [sp, 28] ; Save r22 + st r21, [sp, 32] ; Save r21 + st r20, [sp, 36] ; Save r20 + st r19, [sp, 40] ; Save r19 + st r18, [sp, 44] ; Save r18 + st r17, [sp, 48] ; Save r17 + st r16, [sp, 52] ; Save r16 + st r15, [sp, 56] ; Save r15 + st r14, [sp, 60] ; Save r14 + st r13, [sp, 64] ; Save r13 + st r2, [sp, 68] ; Save status32 + st r30, [sp, 72] ; Save r30 + st sp, [r0, 8] ; Save thread's stack pointer +__tx_save_done: +; + .ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + ld sp, [gp, _tx_thread_system_stack_ptr@sda] ; Switch to system stack + bl.d _tx_execution_thread_exit ; Call the thread exit function + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space + ld r0, [gp, _tx_thread_current_ptr@sda] ; Pickup current thread ptr + mov r3, 0 ; Build clear value + .endif +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + ld r5, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + breq r5, 0, __tx_thread_dont_save_ts ; If not, skip save processing +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + st r3, [gp, _tx_timer_time_slice@sda] ; Clear time-slice variable + st r5, [r0, 24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts: +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + b.d _tx_thread_schedule ; Return to scheduler.. + st r3, [gp, _tx_thread_current_ptr@sda] ; ..clearing current thread pointer +; +;} + .end + + diff --git a/ports/arc_hs/metaware/src/tx_timer_interrupt.s b/ports/arc_hs/metaware/src/tx_timer_interrupt.s new file mode 100644 index 00000000..4edc1aa4 --- /dev/null +++ b/ports/arc_hs/metaware/src/tx_timer_interrupt.s @@ -0,0 +1,238 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARC_HS/MetaWare */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Process timer expiration */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* _tx_thread_context_save Save interrupt context */ +;/* _tx_thread_context_restore Restore interrupt context */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, @function +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed the interrupt stack frame has +; already been allocated and registers r0, r1, and r2 have already been saved +; at offsets 0, 4, and 8 respectively. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + clri ; Lockout interrupts + ld r0, [gp,_tx_timer_system_clock@sda] ; Pickup current system clock + ld r2, [gp, _tx_timer_time_slice@sda] ; Pickup current time-slice + add r0, r0, 1 ; Increment the system clock + st r0, [gp,_tx_timer_system_clock@sda] ; Store system clock back in memory + +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + mov r1, 0 ; Clear expiration flag + breq r2, 0, __tx_timer_no_time_slice ; If zero, no time-slice is active +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + sub r2, r2, 1 ; Decrement time-slice + st r2, [gp, _tx_timer_time_slice@sda] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + brne r2, 0, __tx_timer_no_time_slice ; If non-zero, skip over expiration +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + mov r1, 1 ; Set register flag + st r1, [gp, _tx_timer_expired_time_slice@sda] ; Set the time-slice expired flag + +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + ld r0, [gp, _tx_timer_current_ptr@sda] ; Pickup current timer pointer + ld r2, [r0, 0] ; Pickup examine actual list entry + breq r2, 0, __tx_timer_no_timer ; + ; If NULL, no timer has expired, just move to the next entry +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + mov r1, 1 ; Build expiration value + b.d __tx_timer_done ; Skip moving the timer pointer + st r1, [gp, _tx_timer_expired@sda] ; Set the expired value +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ld r2, [gp, _tx_timer_list_end@sda] ; Pickup end of list + add r0, r0, 4 ; Move to next timer entry +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + st r0, [gp, _tx_timer_current_ptr@sda] ; Store the current timer + brne r0, r2, __tx_timer_skip_wrap ; If not equal, don't wrap the list +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + ld r2, [gp, _tx_timer_list_start@sda] ; Pickup start of timer list + st r2, [gp, _tx_timer_current_ptr@sda] ; Set current timer to the start +; +__tx_timer_skip_wrap: +; +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + breq r1, 0, __tx_timer_nothing_expired ; If 0, nothing has expired +; +__tx_something_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + st blink, [sp, 16] ; Save blink + bl _tx_thread_context_save ; Save interrupted context +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + ld r2, [gp, _tx_timer_expired@sda] ; Pickup timer expired flag + ld r4, [gp, _tx_thread_preempt_disable@sda] ; Pickup preempt disable + breq r2, 0, __tx_timer_dont_activate ; If not set, skip expiration processing +; +; /* Process the timer expiration. */ +; /* _tx_timer_expiration_process(); */ + bl.d _tx_timer_expiration_process ; Call the timer expiration handling routine + sub sp, sp, 16 ; ..allocating some space on the stack + add sp, sp, 16 ; Recover the stack space +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + ld r2, [gp, _tx_timer_expired_time_slice@sda] ; Pickup expired time-slice flag + breq r2, 0, __tx_timer_not_ts_expiration ; If not set, skip time-slice +; +; /* Time slice interrupted thread. */ +; /* _tx_thread_time_slice(); */ + + bl.d _tx_thread_time_slice ; Call time-slice processing + sub sp, sp, 16 ; ..allocating some stack space + add sp, sp, 16 ; Recover stack space +; +; } +; +__tx_timer_not_ts_expiration: +; + st 0, [gp, _tx_timer_expired_time_slice@sda] + b _tx_thread_context_restore ; Go restore interrupt context.. + ; ..clearing time-slice expired flag + ; Note that we don't return from + ; this function. +; +; } +; +__tx_timer_nothing_expired: +; + ld r0, [sp, 0] ; Recover r0 + ld r1, [sp, 4] ; Recover r1 + ld r2, [sp, 8] ; Recover r2 + add sp, sp, 160 ; Recover interrupt stack frame + rtie ; Return to point of interrupt +; +;} + .end + diff --git a/ports/arm9/ac5/example_build/build_threadx.bat b/ports/arm9/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..196340df --- /dev/null +++ b/ports/arm9/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu ARM9TDMI --apcs /interwork tx_initialize_low_level.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_stack_build.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_schedule.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_system_return.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_context_save.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_context_restore.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_timer_interrupt.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu ARM9TDMI --apcs /interwork ../src/tx_thread_vectored_context_save.s +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -c -g -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +armar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/arm9/ac5/example_build/build_threadx_sample.bat b/ports/arm9/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..3fcb0856 --- /dev/null +++ b/ports/arm9/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu ARM9TDMI --apcs /interwork tx_initialize_low_level.s +armcc -g -c -O2 --cpu ARM9TDMI --apcs /interwork -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --ro 0 --first tx_initialize_low_level.o(Init) --remove --map --symbols --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/arm9/ac5/example_build/sample_threadx.c b/ports/arm9/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/arm9/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arm9/ac5/example_build/tx_initialize_low_level.s b/ports/arm9/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..0aa438f5 --- /dev/null +++ b/ports/arm9/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,444 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; Disable IRQ/FIQ SVC mode +IRQ_MODE EQU 0xD2 ; Disable IRQ/FIQ IRQ mode +FIQ_MODE EQU 0xD1 ; Disable IRQ/FIQ FIQ mode +SYS_MODE EQU 0xDF ; Disable IRQ/FIQ SYS mode +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; +;/* ARM9 ARMulator Timer and Interrupt controller information. This depends on +; the ARMulator's Interrupt Controller and Timer being enabled in the default.ami. +; In addition, the addresses must match those specified in the peripherals.ami file. +; Please refer to section 2.10 and 4.16 of the Debug Target Guide, version 1.2. */ +; +IRQStatus EQU 0x0a000000 ; IRQ Status Register +IRQRawStatus EQU 0x0a000004 ; IRQ Raw Status Register +IRQEnable EQU 0x0a000008 ; IRQ Enable Set Register +IRQEnableClear EQU 0x0a00000C ; IRQ Enable Clear Register +IRQSoft EQU 0x0a000010 ; IRQ Soft +FIQStatus EQU 0x0a000100 ; FIQ Status Register +FIQRawStatus EQU 0x0a000104 ; FIQ Raw Status Register +FIQEnable EQU 0x0a000108 ; FIQ Enable Set Register +FIQEnableClear EQU 0x0a00010C ; FIQ Enable Clear Register + +TIMER1_BIT EQU 0x00000010 ; IRQ/FIQ Timer1 bit +TIMER2_BIT EQU 0x00000020 ; IRQ/FIQ Timer2 bit + +Timer1Load EQU 0x0a800000 ; Timer1 Load Register +Timer1Value EQU 0x0a800004 ; Timer1 Value Register +Timer1Control EQU 0x0a800008 ; Timer1 Control Register +Timer1Clear EQU 0x0a80000C ; Timer1 Clear Register + +Timer1Mode EQU 0x000000C0 ; Timer1 Control Value, Timer enable, periodic, no prescaler +Timer1Period EQU 0x0000FFFF ; Timer1 count-down period, maximum value + +Timer2Load EQU 0x0a800020 ; Timer2 Load Register +Timer2Value EQU 0x0a800024 ; Timer2 Value Register +Timer2Control EQU 0x0a800028 ; Timer2 Control Register +Timer2Clear EQU 0x0a80002C ; Timer2 Clear Register +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the ARM9 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_cxsf, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Setup ARMulator Timer1 for periodic interrupts. */ +; + LDR r0,=IRQEnable ; Build address of IRQ enable register + LDR r1,=TIMER1_BIT ; Build value of Timer1 IRQ enable + STR r1,[r0] ; Enable IRQ interrupts for Timer1 + + LDR r0,=Timer1Load ; Build address of Timer1 load register + LDR r1,=Timer1Period ; Build Timer1 periodic value + STR r1,[r0] ; Set Timer1 load value + + LDR r0,=Timer1Control ; Build address of Timer1 control register + LDR r1,=Timer1Mode ; Build Timer1 control value + STR r1,[r0] ; Enable Timer1 +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Check for Timer1 interrupts on the ARMulator. */ + + LDR r1,=IRQStatus ; Pickup address of IRQStatus register + LDR r2, [r1] ; Read IRQStatus + LDR r0,=TIMER1_BIT ; Pickup Timer1 interrupt present bit + AND r2, r2, r0 ; Is this a timer interrupt? + CMP r2, r0 ; + BNE _tx_not_timer_interrupt ; If 0, not a timer interrupt + + LDR r1,=Timer1Clear ; Build address of Timer1 clear register + MOV r0,#0 ; + STR r0, [r1] ; Clear timer 0 interrupt + + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/arm9/ac5/inc/tx_port.h b/ports/arm9/ac5/inc/tx_port.h new file mode 100644 index 00000000..eb445bef --- /dev/null +++ b/ports/arm9/ac5/inc/tx_port.h @@ -0,0 +1,329 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARM9/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARM9/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/arm9/ac5/readme_threadx.txt b/ports/arm9/ac5/readme_threadx.txt new file mode 100644 index 00000000..3fab29c2 --- /dev/null +++ b/ports/arm9/ac5/readme_threadx.txt @@ -0,0 +1,518 @@ + Microsoft's Azure RTOS ThreadX for ARM9 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the ARM9 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu ARM9TDMI Specifies ARM9TDMI instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for ARM9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The ARM9 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, ARM9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/ARM9 Mixed Mode + +By default, ThreadX is setup for running in ARM9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be built +in 32-bit mode. In addition, if any Thumb code is used the entire ThreadX source- +both C and assembly - should be built with the "-apcs /interwork" option. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for ARM9 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arm9/ac5/src/tx_thread_context_restore.s b/ports/arm9/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1e5f4566 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,247 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +THUMB_MASK EQU 0x20 ; Thumb bit mask +SVC_MODE_BITS EQU 0x13 ; SVC mode value +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_context_save.s b/ports/arm9/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..07efa1a6 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_context_save.s @@ -0,0 +1,207 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF + + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_context_restore.s b/ports/arm9/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..5cd93433 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +THUMB_MASK EQU 0x20 ; Thumb bit mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +SVC_MODE_BITS EQU 0x13 ; SVC mode value +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_context_save.s b/ports/arm9/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..941ae79b --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s b/ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..87d9bcc1 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s b/ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..f06e9ec2 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_interrupt_control.s b/ports/arm9/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..c21d687d --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_interrupt_disable.s b/ports/arm9/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..efe72d25 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_interrupt_restore.s b/ports/arm9/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..eac71e91 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_irq_nesting_end.s b/ports/arm9/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..a1bd87ed --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/arm9/ac5/src/tx_thread_irq_nesting_start.s b/ports/arm9/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..1fc8b2dd --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_schedule.s b/ports/arm9/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..fa1eef18 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_schedule.s @@ -0,0 +1,172 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS EQU 0xC0 ; IRQ & FIQ Interrupts enabled mask + ELSE +ENABLE_INTS EQU 0x80 ; IRQ Interrupts enabled mask + ENDIF +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + BL _tx_execution_thread_enter ; Call the thread execution enter function + ENDIF +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r0, r1} ; Pickup the stack type and saved CPSR + CMP r0, #0 ; Check for synchronous context switch + MSRNE SPSR_cxsf, r1 ; Setup SPSR for return + LDMNEIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r1 ; Recover CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_thread_stack_build.s b/ports/arm9/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..2da5649c --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,156 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARM9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/arm9/ac5/src/tx_thread_system_return.s b/ports/arm9/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..697085a3 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_system_return.s @@ -0,0 +1,150 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1, r4-r11, lr} ; Save minimal context +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + + LDR r3, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r0, [r3, #0] ; Pickup current thread pointer + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r0, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r0, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r3, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/arm9/ac5/src/tx_thread_vectored_context_save.s b/ports/arm9/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..c5e1e9f8 --- /dev/null +++ b/ports/arm9/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,209 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; IRQ & FIQ interrupts disabled + ELSE +DISABLE_INTS EQU 0x80 ; IRQ interrupts disabled + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/arm9/ac5/src/tx_timer_interrupt.s b/ports/arm9/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..7997d994 --- /dev/null +++ b/ports/arm9/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARM9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/arm9/gnu/example_build/build_threadx.bat b/ports/arm9/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..47617c67 --- /dev/null +++ b/ports/arm9/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=arm9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=arm9 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/arm9/gnu/example_build/build_threadx_sample.bat b/ports/arm9/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..c35d2bc6 --- /dev/null +++ b/ports/arm9/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=arm9 reset.S +arm-none-eabi-gcc -c -g -mcpu=arm9 crt0.S +arm-none-eabi-gcc -c -g -mcpu=arm9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=arm9 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A arm9 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/arm9/gnu/example_build/crt0.S b/ports/arm9/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/arm9/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/arm9/gnu/example_build/libgcc.a b/ports/arm9/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/arm9/gnu/example_build/libgcc.a differ diff --git a/ports/arm9/gnu/example_build/reset.S b/ports/arm9/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/arm9/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/arm9/gnu/example_build/sample_threadx.c b/ports/arm9/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/arm9/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arm9/gnu/example_build/sample_threadx.ld b/ports/arm9/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/arm9/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/arm9/gnu/example_build/tx_initialize_low_level.S b/ports/arm9/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..00e46e0c --- /dev/null +++ b/ports/arm9/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_cxsf, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/arm9/gnu/inc/tx_port.h b/ports/arm9/gnu/inc/tx_port.h new file mode 100644 index 00000000..a255e792 --- /dev/null +++ b/ports/arm9/gnu/inc/tx_port.h @@ -0,0 +1,316 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARM9/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; ORR %1,%0,#0xC0; MSR CPSR_cxsf,%1 ": "=r" (interrupt_save), "=r" (tx_temp) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; ORR %1,%0,#0x80; MSR CPSR_cxsf,%1 ": "=r" (interrupt_save), "=r" (tx_temp) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_cxsf,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARM9/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/arm9/gnu/readme_threadx.txt b/ports/arm9/gnu/readme_threadx.txt new file mode 100644 index 00000000..262760e6 --- /dev/null +++ b/ports/arm9/gnu/readme_threadx.txt @@ -0,0 +1,496 @@ + Microsoft's Azure RTOS ThreadX for ARM9 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: TX.A. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the ARM9 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=arm9 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A arm9 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for ARM9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The ARM9 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, ARM7 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for ARM9 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arm9/gnu/src/tx_thread_context_restore.S b/ports/arm9/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..a6876848 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,241 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ + MOV r0, #IRQ_MODE @ Build disable interrupts CPSR + MSR CPSR, r0 @ Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/arm9/gnu/src/tx_thread_context_save.S b/ports/arm9/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..a1552e86 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_context_save.S @@ -0,0 +1,210 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt CPSR + MSR CPSR_cxsf, r0 @ Disable interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_context_restore.S b/ports/arm9/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..81e3299b --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,256 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +SVC_MODE_BITS = 0x13 @ SVC mode value +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + MRS r3, CPSR @ Pickup current CPSR + ORR r0, r3, #DISABLE_INTS @ Build interrupt disable value + MSR CPSR_cxsf, r0 @ Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_cxsf, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_cxsf, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_cxsf, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ + BIC r4, r4, #THUMB_MASK @ Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS @ Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 @ Lockout interrupts +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MRS r3, CPSR @ Pickup current CPSR + BIC r3, r3, #MODE_MASK @ Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS @ Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_context_save.S b/ports/arm9/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..88ad7e79 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S b/ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..9705cca4 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,111 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_cxsf, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_cxsf, r0 @ Reenter IRQ mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S b/ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..fd498616 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_interrupt_control.S b/ports/arm9/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ca95b8ac --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/arm9/gnu/src/tx_thread_interrupt_disable.S b/ports/arm9/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..76570a20 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ + ORR r1, r0, #DISABLE_INTS @ Mask interrupts + MSR CPSR_cxsf, r1 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/arm9/gnu/src/tx_thread_interrupt_restore.S b/ports/arm9/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..65e01e32 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_cxsf, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/arm9/gnu/src/tx_thread_irq_nesting_end.S b/ports/arm9/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..8ee9b216 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,111 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_cxsf, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_cxsf, r0 @ Reenter IRQ mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_irq_nesting_start.S b/ports/arm9/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..7174dc11 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_cxsf, r0 @ Enter system mode + MOV pc, r3 @ Return to caller +@} + diff --git a/ports/arm9/gnu/src/tx_thread_schedule.S b/ports/arm9/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..fde52ec5 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_schedule.S @@ -0,0 +1,187 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS = 0xC0 @ IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS = 0x80 @ IRQ Interrupts enabled mask +#endif +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ + MRS r2, CPSR @ Pickup CPSR + BIC r0, r2, #ENABLE_INTS @ Clear the disable bit(s) + MSR CPSR_cxsf, r0 @ Enable interrupts +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ + MSR CPSR_cxsf, r2 @ Disable interrupts +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + BL _tx_execution_thread_enter @ Call the thread execution enter function +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r0, r1} @ Pickup the stack type and saved CPSR + CMP r0, #0 @ Check for synchronous context switch + MSRNE SPSR_cxsf, r1 @ Setup SPSR for return + LDMNEIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously + MSR CPSR_cxsf, r1 @ Recover CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + diff --git a/ports/arm9/gnu/src/tx_thread_stack_build.S b/ports/arm9/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..7d6f47bb --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the ARM9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/arm9/gnu/src/tx_thread_system_return.S b/ports/arm9/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..aa1599a6 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_system_return.S @@ -0,0 +1,167 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1, r4-r11, lr} @ Save minimal context +@ +@ /* Lockout interrupts. */ +@ + ORR r2, r1, #DISABLE_INTS @ Build disable interrupt CPSR + MSR CPSR_cxsf, r2 @ Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + LDR r3, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r0, [r3] @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/arm9/gnu/src/tx_thread_vectored_context_save.S b/ports/arm9/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..f69abcd9 --- /dev/null +++ b/ports/arm9/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,199 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ IRQ & FIQ interrupts disabled +#else +DISABLE_INTS = 0x80 @ IRQ interrupts disabled +#endif +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt CPSR + MSR CPSR_cxsf, r0 @ Disable interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/arm9/gnu/src/tx_timer_interrupt.S b/ports/arm9/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..7871d1bc --- /dev/null +++ b/ports/arm9/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt ARM9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/arm9/iar/example_build/azure_rtos.eww b/ports/arm9/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/arm9/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/arm9/iar/example_build/cstartup.s b/ports/arm9/iar/example_build/cstartup.s new file mode 100644 index 00000000..b95efc0e --- /dev/null +++ b/ports/arm9/iar/example_build/cstartup.s @@ -0,0 +1,161 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + ;; Enable the VFP coprocessor. + + MOV r0, #0x40000000 ; Set EN bit in VFP + FMXR fpexc, r0 ; FPEXC, clear others. + +; +; Disable underflow exceptions by setting flush to zero mode. +; For full IEEE 754 underflow compliance this code should be removed +; and the appropriate exception handler installed. +; + + MOV r0, #0x01000000 ; Set FZ bit in VFP + FMXR fpscr, r0 ; FPSCR, clear others. +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.c b/ports/arm9/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..68cd97fe --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.c @@ -0,0 +1,374 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/arm9/iar/example_build/sample_threadx.dep b/ports/arm9/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..94d9a38b --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.dep @@ -0,0 +1,220 @@ + + + 4 + 3136050671 + + Debug + + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\tx_port.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\TX_ILL.s79 + $TOOLKIT_DIR$\lib\rt4t_al.a + $PROJ_DIR$\Debug\Obj\demo.r79 + $PROJ_DIR$\Debug\List\sample_threadx.map + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\lib\shs_l.a + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\tx_cstartup.s79 + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\yvals.h + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\tx_execution_profile.c + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\List\cstartup.lst + $TOOLKIT_DIR$\lib\dl4t_aln.a + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\lib\m4t_al.a + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\tx_initialize_low_level.s79 + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + [ROOT_NODE] + + + ILINK + 17 11 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 14 42 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 13 + + + BICOMP + 50 + + + __cstat + 58 + + + + + ICCARM + 57 54 41 48 35 47 29 52 46 6 53 26 45 55 56 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 40 37 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 18 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 10 + + + + + ICCARM + 3 5 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 11 + + + + + ILINK + 15 14 13 2 40 22 9 49 43 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 44 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 14 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 28 + + + BICOMP + 20 + + + + + ICCARM + 3 5 31 38 34 27 16 23 7 30 39 19 25 21 + + + BICOMP + 3 5 31 38 34 27 23 7 30 39 19 25 21 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 40 37 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.ewd b/ports/arm9/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..572d1f45 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.ewp b/ports/arm9/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..b20e89d4 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.ewt b/ports/arm9/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..a8417466 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/arm9/iar/example_build/sample_threadx.icf b/ports/arm9/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/arm9/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/arm9/iar/example_build/settings/azure_rtos.wsdt b/ports/arm9/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..0fbbf9bf --- /dev/null +++ b/ports/arm9/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 265 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000E002596000002000000138600001000000010860000090000000C8100001400000004860000020000001781000003000000148100000100000003E10000050000000E81000001000000E980000001000000118600000F00000046810000030000000D81000001000000E880000003000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000070040000000A000065050000 + 0000000059040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000071040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000005101000055040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF51010000320000005501000055040000010000000200001004000000010000003EFFFFFF9E080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000055040000000A00005904000001000000010000100400000001000000C5FBFFFF96000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000070040000000A0000650500000000000059040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..8e5310b2 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..9aeceb8c --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..f90fa82c --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=ARM9TDMI" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..60a8329a --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\arm9\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.crun b/ports/arm9/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.dbgdt b/ports/arm9/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..bb3377a6 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1686 @@ + + + + + + + 394 + 27 + 27 + 2010398909 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + 35 + 1470 + + + 20 + 915 + 244 + 61 + + + + 2 + 0 + 0 + + + + + + 3 + 0 + 0 + + + 0 + 1 + 0 + + + + + + + + 2 + 0 + 0 + + + 187 + 100 + 100 + 100 + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + + + + + + + + + + TabID-32281-8114 + Workspace + Workspace + + + <ws> + <ws>/sample_threadx + <ws>/sample_threadx/Common sources + <ws>/sample_threadx/Common sources/tx_cstartup.s79 + sample_threadx + sample_threadx/Common sources + sample_threadx/Output + sample_threadx/Output/sample_threadx.out + sample_threadx/Output/sample_threadx.out/Output + + + + + 0 + + + + + TabID-31758-8124 + Debug Log + Debug-Log + + + + TabID-9738-8128 + Build + Build + + + + TabID-20156-25745 + Breakpoints + Breakpoints + + + 0 + + + + + + TabID-20390-20629 + Thread List + TX-THREAD + + 1 + + + + TabID-30615-20642 + Message Queues + TX-MESSAGEQUEUE + + + TabID-30093-20652 + Semaphores + TX-SEMAPHORE + + + TabID-29570-20662 + Mutexes + TX-MUTEX + + + TabID-7028-20675 + Byte Pools + TX-BYTEPOOL + + + TabID-6505-20685 + Block Pools + TX-BLOCKPOOL + + + TabID-5982-20694 + Timers + TX-TIMER + + + TabID-5459-20704 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 197 + 7059 + 7059 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 569 + 468 + -2 + -2 + 135 + 169 + 88933 + 182505 + 309618 + 616631 + + + + + + + + + + + + + + + + -2 + -2 + 67 + 1520 + -2 + -2 + 1522 + 69 + 1002635 + 74514 + 88933 + 182505 + + + + + + + + + 65 + -2 + 264 + 1520 + -2 + 65 + 1522 + 199 + 1002635 + 214903 + 127800 + 214903 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 168 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 3C0000000E002596000002000000138600001000000010860000090000000C8100001400000004860000020000001781000003000000148100000100000003E10000050000000E81000008000000E980000001000000118600000F00000046810000030000000D81000001000000E880000003000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 1900578600001800000059920000240000002392000000000000008D00001E00000007860000280000001D9200001100000004860000250000009A860000160000000084000078000000259200001900000044920000220000001A860000320000001F9200001F0000008E8600003B00000006860000270000002D920000210000006986000038000000558600000600000023960000890000000E86000017000000A18600003C000000C386000003000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 510800004000000073090000F0000000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 510800004000000073090000F0000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 510800004000000073090000F0000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 510800004000000073090000F0000000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5108000040000000D10A0000D0000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5108000040000000FF090000D0000000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 510800004000000073090000F0000000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 51080000400000007309000000010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 510800004000000057090000A0010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 510800004000000057090000A0010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5108000040000000FF09000000010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5108000040000000FF09000000010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 510800004000000073090000F0000000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 510800004000000073090000F0000000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 510800004000000073090000F0000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 510800004000000057090000A0010000 + 000800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 510800004000000057090000A0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFFFC0700004C000000000800009A0400000100000002000010040000000100000013F9FFFFAF010000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000020062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/arm9/iar/example_build/settings/sample_threadx.dnx b/ports/arm9/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..7b11d0e2 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 530500706 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl b/ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..f90fa82c --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=ARM9TDMI" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/arm9/iar/example_build/settings/tx.Debug.general.xcl b/ports/arm9/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/arm9/iar/example_build/settings/tx.crun b/ports/arm9/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/arm9/iar/example_build/settings/tx.dbgdt b/ports/arm9/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/arm9/iar/example_build/settings/tx.dnx b/ports/arm9/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/arm9/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/arm9/iar/example_build/tx.dep b/ports/arm9/iar/example_build/tx.dep new file mode 100644 index 00000000..ffa06c4e --- /dev/null +++ b/ports/arm9/iar/example_build/tx.dep @@ -0,0 +1,9603 @@ + + + 4 + 501655296 + + Debug + + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Tx_timcr.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\txe_thread_wait_abort.c + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\txe_timer_delete.c + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\txe_timer_create.c + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Tx_efig.c + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 124 + + + BICOMP + 686 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 600 + + + BICOMP + 109 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 613 + + + BICOMP + 121 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 28 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 55 + + + BICOMP + 75 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 334 358 357 347 33 360 43 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 62 + + + BICOMP + 100 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 33 + + + BICOMP + 358 334 357 347 196 230 360 43 33 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 78 + + + BICOMP + 82 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 28 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 515 + + + BICOMP + 159 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 753 + + + BICOMP + 714 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 28 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 447 + + + BICOMP + 484 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 10 196 255 227 220 28 12 45 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 10 196 255 227 220 28 12 45 33 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 756 + + + BICOMP + 428 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 637 + + + BICOMP + 86 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 522 + + + BICOMP + 88 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 12 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 618 + + + BICOMP + 562 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 334 358 357 347 33 360 43 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 99 + + + BICOMP + 364 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 28 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 711 + + + BICOMP + 666 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 12 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 92 + + + BICOMP + 662 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 251 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 12 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 115 + + + BICOMP + 558 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 597 + + + BICOMP + 509 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 566 + + + BICOMP + 735 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 33 + + + BICOMP + 360 251 334 357 358 347 43 33 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 116 + + + BICOMP + 518 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 12 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 142 + + + BICOMP + 607 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 617 + + + BICOMP + 473 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 652 + + + BICOMP + 445 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 28 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 464 + + + BICOMP + 564 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 28 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 139 + + + BICOMP + 752 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 33 + + + BICOMP + 360 33 251 230 334 357 358 347 43 196 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 737 + + + BICOMP + 350 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 33 + + + BICOMP + 360 33 251 334 357 358 347 43 196 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 554 + + + BICOMP + 621 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 33 + + + BICOMP + 360 33 251 334 357 358 347 43 196 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 371 + + + BICOMP + 122 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 334 358 357 347 33 360 43 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 654 + + + BICOMP + 378 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 28 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 624 + + + BICOMP + 414 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 33 + + + BICOMP + 358 334 230 357 347 196 360 43 33 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 689 + + + BICOMP + 407 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 33 + + + BICOMP + 358 334 230 357 347 196 360 43 33 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 528 + + + BICOMP + 102 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 389 357 45 345 390 347 43 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 614 + + + BICOMP + 595 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 33 + + + BICOMP + 360 251 334 357 358 347 43 33 230 380 345 391 390 351 389 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 708 + + + BICOMP + 707 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 45 + + + BICOMP + 345 347 357 390 251 389 43 45 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 70 + + + BICOMP + 631 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 45 + + + BICOMP + 389 230 357 196 345 390 347 43 45 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 588 + + + BICOMP + 63 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 45 + + + BICOMP + 345 347 357 45 390 251 389 43 196 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 394 + + + BICOMP + 465 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 389 357 45 345 390 347 43 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 663 + + + BICOMP + 388 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 389 357 45 345 390 347 43 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 623 + + + BICOMP + 439 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 45 + + + BICOMP + 345 347 357 45 390 251 389 43 196 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 80 + + + BICOMP + 462 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 45 + + + BICOMP + 389 230 357 196 345 390 347 43 45 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 725 + + + BICOMP + 96 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 45 + + + BICOMP + 345 347 357 45 390 251 389 43 196 230 391 351 380 334 358 360 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 728 + + + BICOMP + 444 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 45 + + + BICOMP + 345 347 357 390 251 389 43 45 230 391 351 380 334 358 360 + + + + + [ROOT_NODE] + + + IARCHIVE + 338 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 43 230 590 160 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 43 230 557 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 43 230 590 160 49 424 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 43 230 557 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 43 230 729 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 43 230 691 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 130 + + + BICOMP + 104 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 459 + + + BICOMP + 141 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 93 + + + BICOMP + 535 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 95 + + + BICOMP + 730 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 227 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 688 + + + BICOMP + 366 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 10 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 10 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 537 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 164 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 581 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 661 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 530 + + + BICOMP + 599 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 502 + + + BICOMP + 695 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 442 + + + BICOMP + 638 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 416 + + + BICOMP + 553 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 538 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 461 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 511 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 592 + + + BICOMP + 625 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 632 + + + BICOMP + 512 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 57 + + + BICOMP + 403 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 155 + + + BICOMP + 136 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 10 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 10 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 138 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 84 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 665 + + + BICOMP + 641 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 548 + + + BICOMP + 524 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 755 + + + BICOMP + 128 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 458 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 539 + + + BICOMP + 719 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 709 + + + BICOMP + 427 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 81 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 611 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 684 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 504 + + + BICOMP + 622 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 377 + + + BICOMP + 117 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 393 + + + BICOMP + 742 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 384 + + + BICOMP + 570 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 759 + + + BICOMP + 718 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 585 + + + BICOMP + 593 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 486 + + + BICOMP + 85 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 227 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 741 + + + BICOMP + 101 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 79 + + + BICOMP + 533 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 227 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 612 + + + BICOMP + 151 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 683 + + + BICOMP + 673 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 90 + + + BICOMP + 596 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 373 + + + BICOMP + 376 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 761 + + + BICOMP + 455 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 169 + + + BICOMP + 369 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 220 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 51 + + + BICOMP + 655 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 12 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 490 + + + BICOMP + 598 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 12 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 555 + + + BICOMP + 660 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 220 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 525 + + + BICOMP + 715 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 423 + + + BICOMP + 153 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 220 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 449 + + + BICOMP + 446 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 220 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 736 + + + BICOMP + 483 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 140 + + + BICOMP + 468 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 227 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 750 + + + BICOMP + 505 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 385 + + + BICOMP + 402 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 220 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 64 + + + BICOMP + 409 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 671 + + + BICOMP + 477 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 717 + + + BICOMP + 720 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 227 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 173 + + + BICOMP + 704 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 703 + + + BICOMP + 579 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 147 + + + BICOMP + 367 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 67 + + + BICOMP + 716 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 421 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 470 + + + BICOMP + 98 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 480 + + + BICOMP + 460 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 758 + + + BICOMP + 677 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 519 + + + BICOMP + 448 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 196 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 547 + + + BICOMP + 343 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 196 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 441 + + + BICOMP + 620 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 152 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 699 + + + BICOMP + 374 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 471 + + + BICOMP + 469 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 523 + + + BICOMP + 552 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 727 + + + BICOMP + 431 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 368 + + + BICOMP + 628 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 251 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 56 + + + BICOMP + 610 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 527 + + + BICOMP + 106 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 692 + + + BICOMP + 332 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 342 + + + BICOMP + 397 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 606 + + + BICOMP + 392 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 375 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 355 + + + BICOMP + 567 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 418 + + + BICOMP + 476 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 167 + + + BICOMP + 494 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 71 + + + BICOMP + 135 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 255 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 158 + + + BICOMP + 520 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 492 + + + BICOMP + 653 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 501 + + + BICOMP + 97 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 255 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 166 + + + BICOMP + 580 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 103 + + + BICOMP + 94 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 196 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 406 + + + BICOMP + 650 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 457 + + + BICOMP + 500 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 45 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 453 + + + BICOMP + 549 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 45 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 133 + + + BICOMP + 65 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 87 + + + BICOMP + 73 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 546 + + + BICOMP + 532 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 543 + + + BICOMP + 146 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 45 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 370 + + + BICOMP + 647 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 45 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 145 + + + BICOMP + 667 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 33 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 48 + + + BICOMP + 485 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 60 + + + BICOMP + 365 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 33 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 72 + + + BICOMP + 745 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 28 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 52 + + + BICOMP + 496 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 28 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 626 + + + BICOMP + 721 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 28 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 635 + + + BICOMP + 682 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 576 + + + BICOMP + 426 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 12 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 105 + + + BICOMP + 422 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 12 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 642 + + + BICOMP + 578 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 542 + + + BICOMP + 740 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 33 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 150 + + + BICOMP + 58 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 33 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 754 + + + BICOMP + 506 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 45 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 508 + + + BICOMP + 479 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 712 + + + BICOMP + 747 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 45 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 45 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 536 + + + BICOMP + 541 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 491 + + + BICOMP + 507 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 251 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 251 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 137 + + + BICOMP + 700 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 28 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 28 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 50 + + + BICOMP + 110 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 33 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 149 + + + BICOMP + 651 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 33 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 33 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 734 + + + BICOMP + 679 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 454 + + + BICOMP + 658 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 526 + + + BICOMP + 437 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 227 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 359 + + + BICOMP + 434 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 157 + + + BICOMP + 521 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 382 + + + BICOMP + 162 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 676 + + + BICOMP + 560 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 148 + + + BICOMP + 383 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 587 + + + BICOMP + 751 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 698 + + + BICOMP + 748 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 108 + + + BICOMP + 657 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 615 + + + BICOMP + 107 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 636 + + + BICOMP + 170 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 534 + + + BICOMP + 732 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 372 + + + BICOMP + 583 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 648 + + + BICOMP + 540 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 713 + + + BICOMP + 550 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 255 196 220 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 165 + + + BICOMP + 125 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 436 + + + BICOMP + 472 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 608 + + + BICOMP + 123 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 59 + + + BICOMP + 702 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 456 + + + BICOMP + 69 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 696 + + + BICOMP + 705 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 220 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 605 + + + BICOMP + 466 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 227 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 127 + + + BICOMP + 723 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 12 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 551 + + + BICOMP + 429 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 12 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 577 + + + BICOMP + 584 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 482 + + + BICOMP + 353 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 668 + + + BICOMP + 354 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 227 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 134 + + + BICOMP + 335 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 12 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 10 12 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 463 + + + BICOMP + 61 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 196 220 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 196 220 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 706 + + + BICOMP + 675 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 227 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 227 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 569 + + + BICOMP + 163 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 80 70 708 588 728 528 394 663 623 725 624 689 614 554 566 618 55 371 737 62 139 78 99 464 654 652 124 600 515 613 753 711 447 756 637 814 522 92 115 597 116 142 617 64 51 490 377 169 449 736 525 683 555 90 671 585 750 385 373 423 612 717 79 140 504 486 741 393 384 759 761 95 458 537 688 665 502 138 164 81 581 442 530 416 684 538 511 661 461 592 93 632 539 548 57 155 84 130 755 709 611 459 56 758 355 547 152 519 441 368 71 492 375 606 418 501 167 158 527 173 703 147 692 67 421 470 699 480 471 342 523 727 642 536 546 133 103 508 87 491 406 48 543 457 754 453 712 370 542 50 149 145 150 60 72 52 626 635 137 166 576 105 551 359 127 134 713 577 372 615 608 696 482 463 734 605 668 706 526 454 59 148 698 587 157 382 456 676 108 636 534 648 165 436 435 574 544 569 475 129 111 749 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 435 + + + BICOMP + 91 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 749 + + + BICOMP + 591 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 574 + + + BICOMP + 481 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 129 + + + BICOMP + 54 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 544 + + + BICOMP + 333 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 255 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 111 + + + BICOMP + 83 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 196 255 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 475 + + + BICOMP + 132 + + + + + ICCARM + 43 230 380 347 357 358 351 389 345 390 391 360 334 10 196 255 + + + BICOMP + 43 230 380 347 357 358 389 381 363 345 391 360 334 10 196 255 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 43 230 160 746 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 43 230 160 590 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 43 230 656 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 43 230 49 160 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 43 230 590 160 49 729 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 43 230 160 49 590 424 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 43 230 746 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 43 230 746 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 43 230 590 160 49 691 656 746 729 557 424 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 43 230 424 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 43 230 656 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 43 230 424 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 43 230 49 160 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 43 230 590 160 49 557 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 43 230 590 160 49 424 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 43 230 691 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 43 230 49 160 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 43 230 160 746 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 43 230 160 49 746 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 43 230 590 160 49 557 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 43 230 160 49 424 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 43 230 590 160 49 691 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 43 230 160 49 691 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 43 230 729 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 43 230 160 656 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 43 230 160 557 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 43 230 590 160 49 557 + + + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 462 631 707 63 444 102 465 388 439 96 414 407 595 621 735 562 75 122 350 100 752 82 364 564 378 445 686 109 159 121 714 666 484 428 86 88 662 558 509 518 607 473 409 655 598 117 369 446 483 715 673 660 596 477 593 505 402 376 153 151 720 533 468 622 85 101 742 570 718 455 730 366 641 695 638 599 553 625 535 512 719 524 403 136 104 128 427 141 610 677 567 343 448 620 628 135 653 392 476 97 494 520 106 704 579 367 332 716 98 374 460 469 397 552 431 578 541 532 65 94 479 73 507 650 485 146 500 506 549 747 647 740 110 651 667 58 365 745 496 721 682 700 580 426 422 429 434 723 335 550 584 583 107 123 705 353 61 679 466 354 675 437 658 702 383 748 751 521 162 69 560 657 170 732 540 125 472 91 481 333 163 132 54 83 591 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 43 230 160 49 557 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 43 230 49 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 43 230 160 49 656 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 43 230 729 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 43 230 160 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 43 230 590 160 49 746 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 43 230 160 424 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 43 230 160 691 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 43 230 160 49 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 43 230 656 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 43 230 590 160 49 656 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 43 230 160 729 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 43 230 160 590 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 43 230 160 49 729 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 43 230 590 160 49 746 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 43 230 590 160 49 729 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 43 230 590 160 49 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 480 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 471 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 523 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 508 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 406 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 48 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 543 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 453 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 370 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 342 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 536 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 546 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 542 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 50 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 87 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 149 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 145 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 150 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 60 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 754 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 727 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 72 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 52 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 133 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 470 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 103 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 712 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 491 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 642 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 457 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 699 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 574 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 108 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 436 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 676 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 475 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 129 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 435 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 636 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 534 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 165 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 544 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 111 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 569 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 749 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 648 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 725 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 689 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 554 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 528 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 566 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 614 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 624 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 588 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 80 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 728 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 394 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 663 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 708 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 70 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 623 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 776 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 511 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 684 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 581 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 661 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 375 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 538 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 611 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 81 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 461 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 421 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 711 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 768 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 537 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 458 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 138 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 164 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 84 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 152 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 142 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 92 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 773 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 124 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 737 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 99 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 464 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 51 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 515 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 652 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 753 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 115 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 490 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 814 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 618 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 522 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 377 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 600 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 613 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 62 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 78 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 756 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 55 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 447 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 775 765 774 771 772 770 768 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 637 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 371 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 139 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 116 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 597 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 617 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 64 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 654 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 384 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 761 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 442 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 530 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 665 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 502 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 671 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 140 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 759 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 416 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 486 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 741 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 525 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 95 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 750 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 169 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 585 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 717 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 79 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 504 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 385 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 683 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 423 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 90 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 393 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 449 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 688 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 775 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 612 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 555 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 736 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 373 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 696 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 137 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 734 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 127 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 166 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 577 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 372 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 668 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 148 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 587 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 626 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 576 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 551 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 774 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 134 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 765 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 605 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 526 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 454 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 706 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 615 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 59 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 713 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 775 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 463 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 608 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 157 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 482 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 382 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 359 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 698 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 771 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 456 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 105 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 768 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 635 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 606 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 709 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 418 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 368 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 167 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 459 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 547 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 155 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 775 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 158 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 527 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 71 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 501 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 519 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 147 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 355 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 692 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 592 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 56 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 492 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 173 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 703 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 441 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 67 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 93 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 130 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 755 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 632 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 539 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 548 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 57 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 758 + + + + + ICCARM + 769 764 380 347 357 358 351 389 345 390 391 360 334 763 762 773 765 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/arm9/iar/example_build/tx.ewd b/ports/arm9/iar/example_build/tx.ewd new file mode 100644 index 00000000..c9ab0958 --- /dev/null +++ b/ports/arm9/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/arm9/iar/example_build/tx.ewp b/ports/arm9/iar/example_build/tx.ewp new file mode 100644 index 00000000..82bc09aa --- /dev/null +++ b/ports/arm9/iar/example_build/tx.ewp @@ -0,0 +1,2766 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/arm9/iar/example_build/tx.ewt b/ports/arm9/iar/example_build/tx.ewt new file mode 100644 index 00000000..2149bed8 --- /dev/null +++ b/ports/arm9/iar/example_build/tx.ewt @@ -0,0 +1,3427 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/arm9/iar/example_build/tx_initialize_low_level.s b/ports/arm9/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..36bcc6a3 --- /dev/null +++ b/ports/arm9/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/arm9/iar/inc/tx_port.h b/ports/arm9/iar/inc/tx_port.h new file mode 100644 index 00000000..ed501c4b --- /dev/null +++ b/ports/arm9/iar/inc/tx_port.h @@ -0,0 +1,388 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h ARM9/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX ARM9/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/arm9/iar/readme_threadx.txt b/ports/arm9/iar/readme_threadx.txt new file mode 100644 index 00000000..67ea7d01 --- /dev/null +++ b/ports/arm9/iar/readme_threadx.txt @@ -0,0 +1,528 @@ + Microsoft's Azure RTOS ThreadX for ARM9 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based ARM9 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's ARM9 simulator. + +A SPECIAL NOTE: The IAR ARM simulator does simulate interrupts. In order +for the ThreadX demonstration to run properly, a periodic IRQ interrupt must +be setup in the IAR debugging environment. We recommend setting an IRQ +interrupt to execute every 9999 cycles. + + +3. System Initialization + +The entry point in ThreadX for the ARM9 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for ARM9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The ARM9 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, ARM9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/ARM9 Mixed Mode + +By default, ThreadX is setup for running in ARM9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for ARM9 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/arm9/iar/src/tx_iar.c b/ports/arm9/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/arm9/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/arm9/iar/src/tx_thread_context_restore.s b/ports/arm9/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..8f8f4047 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_context_restore.s @@ -0,0 +1,245 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_context_save.s b/ports/arm9/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..8d39c7f0 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_context_save.s @@ -0,0 +1,211 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_context_restore.s b/ports/arm9/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..3d9b735f --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,257 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_context_save.s b/ports/arm9/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..3c65cda2 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_nesting_end.s b/ports/arm9/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..673c912a --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_fiq_nesting_start.s b/ports/arm9/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..b4bd8c67 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_interrupt_control.s b/ports/arm9/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..6c02c8e3 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/arm9/iar/src/tx_thread_interrupt_disable.s b/ports/arm9/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..4b36594c --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/arm9/iar/src/tx_thread_interrupt_restore.s b/ports/arm9/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..0a929e6d --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/arm9/iar/src/tx_thread_irq_nesting_end.s b/ports/arm9/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..93db4900 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_irq_nesting_start.s b/ports/arm9/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..300f7838 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/arm9/iar/src/tx_thread_schedule.s b/ports/arm9/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..09e832e1 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_schedule.s @@ -0,0 +1,171 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + BL _tx_execution_thread_enter ; Call the thread execution enter function +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r0, r1} ; Pickup the stack type and saved CPSR + CMP r0, #0 ; Check for synchronous context switch + MSRNE SPSR_cxsf, r1 ; Setup SPSR for return + LDMNEIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r1 ; Recover CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + END + diff --git a/ports/arm9/iar/src/tx_thread_stack_build.s b/ports/arm9/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..fcf39a3f --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the ARM9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/arm9/iar/src/tx_thread_system_return.s b/ports/arm9/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..5212168d --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_system_return.s @@ -0,0 +1,149 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1, r4-r11, lr} ; Save minimal context +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r3, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r0, [r3, #0] ; Pickup current thread pointer + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r0, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r0, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r3, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/arm9/iar/src/tx_thread_vectored_context_save.s b/ports/arm9/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..cf11f910 --- /dev/null +++ b/ports/arm9/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/arm9/iar/src/tx_timer_interrupt.s b/ports/arm9/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..1a508c6a --- /dev/null +++ b/ports/arm9/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt ARM9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/c667x/ccs/example_build/include/C66XX.h b/ports/c667x/ccs/example_build/include/C66XX.h new file mode 100644 index 00000000..581b563e --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX.h @@ -0,0 +1,150 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + Definitions, macros and API functions for DSP Environment. + (C) MicroLAB Systems, 2015 + + + http://www.mlabsys.com + ftp://ftp.mlabsys.com + email: techsupport@mlabsys.com + + + Description: + ------------ + This file contains definitions, macros and API functions for KeyStone + Multicore DSP environment and must be included in the user C-application. + DSP Software Development Kit library is based on TI Chip Support Library + (CSL), so it's needed to add CSL libraries into the project along with DSP + Software Development Kit library. + + Note that C66xx CorePac interrupt controller (INTC) functions are not + included in this DSP Software Utilities library. + It's delivered as a separate library from the remaining DSP Software + Utilities. When using an embedded operating system that contains interrupt + controller/dispatcher support, do not link in the INTC library. + For interrupt controller support, SYS/BIOS users should use + the HWI (Hardware Interrupt) and ECM (Event Combiner Manager) modules + supported under SYS/BIOS v5.21 or later. + + + Revision history: + ----------------- + rev.1A - 2014, initial release for C6678 DSP. + rev.1B - 2015, fixed minor bugs. + rev.1C - 2015: + - changed C66XX_init_ddr3() DDR3 initialization + function; + - added DSP chip-level (CPINTC) interrupt controller + functions; + rev.2A - 2015, totally redesigned DSP SDK; + + + Notes: + ------ + 1. This C-header file is an include file for TI C6xxx C/C++ Code + Generation Tools, which must be invoked to compile code for C66xx DSP + platform. + + 2. The following additional libraries should be included: + TI Chip Support Library (CSL) (ti.csl.ae66) should be included in + Linker options (this library is located at + $(TI_PDK_C6678_INSTALL_DIR)\packages\ti\csl\lib). + + 3. This file is best viewed with the TAB setting set to '4'. + + 4. This header file is externally controlled from user C-code by run-time + compiler keys definitions in order to apply DSP-type specific + definitions to refer to particular definitions included for different + DSP type: + + __C66XX_SELECT_C6678_DSP__ + - if defined in user code prior inclusion of this header file, + then DSP-type specific definitions are applied to C6678 DSP + + Copyright: + ---------- + This utility is supplied free of charge as it is without any obligation + from MicroLAB Systems. No responsibility is assumed for any use or misuse + of these utilities. + +******************************************************************************/ + + +/** + * @file C66XX.h + * + * @brief KeyStone Multicore DSP SDK include file + * + * This file contains definitions, macros and API functions for KeyStone + * Multicore DSP environment + * + */ + + +#ifndef __C66XX_H__ // check for this file has been already included +#define __C66XX_H__ 1 + + +// General defs +#define C66XX_ON 1 +#define C66XX_OFF 0 + + +//============================================================================= +//------------ DSP-type specific run-time compiler keys processing ------------ +// (this is required in order to exclude key confusions) + +// Default setting is C6678 definitions +#ifndef __C66XX_SELECT_C6678_DSP__ +#define __C66XX_SELECT_C6678_DSP__ 1 +#endif /* __C66XX_SELECT_C6678_DSP__ */ + +//============================================================================= + + +/** KeyStone Multicore DSP SDK revision ID */ +#define C66XX_SDK_REVISION_ID "2A" + + +// Include TI Chip Support Library (CSL) defs +// CSL Chip Functional Layer +#include +// CSL TSC Functional Layer +#include +// CSL Cache Functional Layer +#include +// CSL Boot configuration defs +#include +// CSL Power and Sleep Controller defs +#include +// CSL XMC Controller defs +#include +// CSL DDR3 defs +#include +#include +// CSL INTC defs +#include +// CSL CPINTC defs +#include +// CSL SGMII defs +#include +#include +// CSL GPIO Functional Layer +#include +// CSL Timer Functional Layer +#include +// CSL UART Functional Layer +#include +// CSL SRIO Functional Layer +#include +#include + + +// Include C66xx DSP defs, macros and aux functions +#include "C66XX_DEF.hxx" +#include "C66XX_MACROS.hxx" +#include "C66XX_FUNCTIONS.hxx" + + +//============================================================================= +#endif /* __C66XX_H__ */ diff --git a/ports/c667x/ccs/example_build/include/C66XX_DEF.hxx b/ports/c667x/ccs/example_build/include/C66XX_DEF.hxx new file mode 100644 index 00000000..9764a47f --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX_DEF.hxx @@ -0,0 +1,1678 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + (C) MicroLAB Systems, 2014-2015 + + File: Definitions + ----- + + Notes: + ------ + 1. This C-header file contains general DSP definitions and + is used with C66XX.h C-header file. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file C66XX_DEF.hxx + * + * @brief Definitions + * + * This file contains general C66xx DSP definitions + * + */ + + +#ifndef __C66XX_DEF_HXX__ // check for this file has been already included +#define __C66XX_DEF_HXX__ 1 + + +//============================================================================= +//============ DSP CPU ID ===================================================== +//============================================================================= + +// DSP CPU ID is located at CSR register and is used to identify the chip +#define C66XX_DSP_CPU_ID 0x15 +//============================================================================= + + + +#ifdef __C66XX_SELECT_C6678_DSP__ +//============================================================================= +//============ DSP cores number =============================================== +//============================================================================= +#define C66XX_DSP_NUMBER_OF_CORES 8 +//============================================================================= + + +//============================================================================= +//============ DSP memory map ================================================= +//============================================================================= +// All address ranges refer to 32-bit LOGICAL addresses!!! + +// Local L2 SRAM - 512KB +#define C66XX_LOCAL_L2_SRAM_SADDR 0x00800000 +#define C66XX_LOCAL_L2_SRAM_EADDR 0x0087ffff +#define C66XX_LOCAL_L2_SRAM_LEN (C66XX_LOCAL_L2_SRAM_EADDR - C66XX_LOCAL_L2_SRAM_SADDR + 1) + +// Local L1P SRAM - 32KB +#define C66XX_LOCAL_L1P_SRAM_SADDR 0x00e00000 +#define C66XX_LOCAL_L1P_SRAM_EADDR 0x00e07fff +#define C66XX_LOCAL_L1P_SRAM_LEN (C66XX_LOCAL_L1P_SRAM_EADDR - C66XX_LOCAL_L1P_SRAM_SADDR + 1) + +// Local L1D SRAM - 32KB +#define C66XX_LOCAL_L1D_SRAM_SADDR 0x00f00000 +#define C66XX_LOCAL_L1D_SRAM_EADDR 0x00f07fff +#define C66XX_LOCAL_L1D_SRAM_LEN (C66XX_LOCAL_L1D_SRAM_EADDR - C66XX_LOCAL_L1D_SRAM_SADDR + 1) + +// C66xx CorePack registers area - 4MB +#define C66XX_DSP_RG_AREA_SADDR 0x01800000 +#define C66XX_DSP_RG_AREA_EADDR 0x01bfffff +#define C66XX_DSP_RG_AREA_LEN (C66XX_DSP_RG_AREA_EADDR - C66XX_DSP_RG_AREA_SADDR + 1) + +// Tracer MSMC 0 registers area - 128B +#define C66XX_TRACER_MSMC_0_RG_AREA_SADDR 0x01d00000 +#define C66XX_TRACER_MSMC_0_RG_AREA_EADDR 0x01d0007f +#define C66XX_TRACER_MSMC_0_RG_AREA_LEN (C66XX_TRACER_MSMC_0_RG_AREA_EADDR - C66XX_TRACER_MSMC_0_RG_AREA_SADDR + 1) + +// Tracer MSMC 1 registers area - 128B +#define C66XX_TRACER_MSMC_1_RG_AREA_SADDR 0x01d08000 +#define C66XX_TRACER_MSMC_1_RG_AREA_EADDR 0x01d0807f +#define C66XX_TRACER_MSMC_1_RG_AREA_LEN (C66XX_TRACER_MSMC_1_RG_AREA_EADDR - C66XX_TRACER_MSMC_1_RG_AREA_SADDR + 1) + +// Tracer MSMC 2 registers area - 128B +#define C66XX_TRACER_MSMC_2_RG_AREA_SADDR 0x01d10000 +#define C66XX_TRACER_MSMC_2_RG_AREA_EADDR 0x01d1007f +#define C66XX_TRACER_MSMC_2_RG_AREA_LEN (C66XX_TRACER_MSMC_2_RG_AREA_EADDR - C66XX_TRACER_MSMC_2_RG_AREA_SADDR + 1) + +// Tracer MSMC 3 registers area - 128B +#define C66XX_TRACER_MSMC_3_RG_AREA_SADDR 0x01d18000 +#define C66XX_TRACER_MSMC_3_RG_AREA_EADDR 0x01d1807f +#define C66XX_TRACER_MSMC_3_RG_AREA_LEN (C66XX_TRACER_MSMC_3_RG_AREA_EADDR - C66XX_TRACER_MSMC_3_RG_AREA_SADDR + 1) + +// Tracer QM DMA registers area - 128B +#define C66XX_TRACER_QM_DMA_RG_AREA_SADDR 0x01d20000 +#define C66XX_TRACER_QM_DMA_RG_AREA_EADDR 0x01d2007f +#define C66XX_TRACER_QM_DMA_RG_AREA_LEN (C66XX_TRACER_QM_DMA_RG_AREA_EADDR - C66XX_TRACER_QM_DMA_RG_AREA_SADDR + 1) + +// Tracer DDR registers area - 128B +#define C66XX_TRACER_DDR_RG_AREA_SADDR 0x01d28000 +#define C66XX_TRACER_DDR_RG_AREA_EADDR 0x01d2807f +#define C66XX_TRACER_DDR_RG_AREA_LEN (C66XX_TRACER_DDR_RG_AREA_EADDR - C66XX_TRACER_DDR_RG_AREA_SADDR + 1) + +// Tracer SM registers area - 128B +#define C66XX_TRACER_SM_RG_AREA_SADDR 0x01d30000 +#define C66XX_TRACER_SM_RG_AREA_EADDR 0x01d3007f +#define C66XX_TRACER_SM_RG_AREA_LEN (C66XX_TRACER_SM_RG_AREA_EADDR - C66XX_TRACER_SM_RG_AREA_SADDR + 1) + +// Tracer QM CFG registers area - 128B +#define C66XX_TRACER_QM_CFG_RG_AREA_SADDR 0x01d38000 +#define C66XX_TRACER_QM_CFG_RG_AREA_EADDR 0x01d3807f +#define C66XX_TRACER_QM_CFG_RG_AREA_LEN (C66XX_TRACER_QM_CFG_RG_AREA_EADDR - C66XX_TRACER_QM_CFG_RG_AREA_SADDR + 1) + +// Tracer CFG registers area - 128B +#define C66XX_TRACER_CFG_RG_AREA_SADDR 0x01d40000 +#define C66XX_TRACER_CFG_RG_AREA_EADDR 0x01d4007f +#define C66XX_TRACER_CFG_RG_AREA_LEN (C66XX_TRACER_CFG_RG_AREA_EADDR - C66XX_TRACER_CFG_RG_AREA_SADDR + 1) + +// Tracer L2 0 registers area - 128B +#define C66XX_TRACER_L2_0_RG_AREA_SADDR 0x01d48000 +#define C66XX_TRACER_L2_0_RG_AREA_EADDR 0x01d4807f +#define C66XX_TRACER_L2_0_RG_AREA_LEN (C66XX_TRACER_L2_0_RG_AREA_EADDR - C66XX_TRACER_L2_0_RG_AREA_SADDR + 1) + +// Tracer L2 1 registers area - 128B +#define C66XX_TRACER_L2_1_RG_AREA_SADDR 0x01d50000 +#define C66XX_TRACER_L2_1_RG_AREA_EADDR 0x01d5007f +#define C66XX_TRACER_L2_1_RG_AREA_LEN (C66XX_TRACER_L2_1_RG_AREA_EADDR - C66XX_TRACER_L2_1_RG_AREA_SADDR + 1) + +// Tracer L2 2 registers area - 128B +#define C66XX_TRACER_L2_2_RG_AREA_SADDR 0x01d58000 +#define C66XX_TRACER_L2_2_RG_AREA_EADDR 0x01d5807f +#define C66XX_TRACER_L2_2_RG_AREA_LEN (C66XX_TRACER_L2_2_RG_AREA_EADDR - C66XX_TRACER_L2_2_RG_AREA_SADDR + 1) + +// Tracer L2 3 registers area - 128B +#define C66XX_TRACER_L2_3_RG_AREA_SADDR 0x01d60000 +#define C66XX_TRACER_L2_3_RG_AREA_EADDR 0x01d6007f +#define C66XX_TRACER_L2_3_RG_AREA_LEN (C66XX_TRACER_L2_3_RG_AREA_EADDR - C66XX_TRACER_L2_3_RG_AREA_SADDR + 1) + +// Tracer L2 4 registers area - 128B +#define C66XX_TRACER_L2_4_RG_AREA_SADDR 0x01d68000 +#define C66XX_TRACER_L2_4_RG_AREA_EADDR 0x01d6807f +#define C66XX_TRACER_L2_4_RG_AREA_LEN (C66XX_TRACER_L2_4_RG_AREA_EADDR - C66XX_TRACER_L2_4_RG_AREA_SADDR + 1) + +// Tracer L2 5 registers area - 128B +#define C66XX_TRACER_L2_5_RG_AREA_SADDR 0x01d70000 +#define C66XX_TRACER_L2_5_RG_AREA_EADDR 0x01d7007f +#define C66XX_TRACER_L2_5_RG_AREA_LEN (C66XX_TRACER_L2_5_RG_AREA_EADDR - C66XX_TRACER_L2_5_RG_AREA_SADDR + 1) + +// Tracer L2 6 registers area - 128B +#define C66XX_TRACER_L2_6_RG_AREA_SADDR 0x01d78000 +#define C66XX_TRACER_L2_6_RG_AREA_EADDR 0x01d7807f +#define C66XX_TRACER_L2_6_RG_AREA_LEN (C66XX_TRACER_L2_6_RG_AREA_EADDR - C66XX_TRACER_L2_6_RG_AREA_SADDR + 1) + +// Tracer L2 7 registers area - 128B +#define C66XX_TRACER_L2_7_RG_AREA_SADDR 0x01d80000 +#define C66XX_TRACER_L2_7_RG_AREA_EADDR 0x01d8007f +#define C66XX_TRACER_L2_7_RG_AREA_LEN (C66XX_TRACER_L2_7_RG_AREA_EADDR - C66XX_TRACER_L2_7_RG_AREA_SADDR + 1) + +// Telecom Serial Interface Port (TSIP) 0 registers area - 256KB +#define C66XX_TSIP_0_RG_AREA_SADDR 0x01e00000 +#define C66XX_TSIP_0_RG_AREA_EADDR 0x01e3ffff +#define C66XX_TSIP_0_RG_AREA_LEN (C66XX_TSIP_0_RG_AREA_EADDR - C66XX_TSIP_0_RG_AREA_SADDR + 1) + +// Telecom Serial Interface Port (TSIP) 1 registers area - 256KB +#define C66XX_TSIP_1_RG_AREA_SADDR 0x01e80000 +#define C66XX_TSIP_1_RG_AREA_EADDR 0x01ebffff +#define C66XX_TSIP_1_RG_AREA_LEN (C66XX_TSIP_1_RG_AREA_EADDR - C66XX_TSIP_1_RG_AREA_SADDR + 1) + +// Network Coprocessor (NETCP) registers area - 1MB +#define C66XX_NETCP_RG_AREA_SADDR 0x02000000 +#define C66XX_NETCP_RG_AREA_EADDR 0x020fffff +#define C66XX_NETCP_RG_AREA_LEN (C66XX_NETCP_RG_AREA_EADDR - C66XX_NETCP_RG_AREA_SADDR + 1) + +// Timer0 registers area - 128B +#define C66XX_TIMER_0_RG_AREA_SADDR 0x02200000 +#define C66XX_TIMER_0_RG_AREA_EADDR 0x0220007f +#define C66XX_TIMER_0_RG_AREA_LEN (C66XX_TIMER_0_RG_AREA_EADDR - C66XX_TIMER_0_RG_AREA_SADDR + 1) + +// Timer1 registers area - 128B +#define C66XX_TIMER_1_RG_AREA_SADDR 0x02210000 +#define C66XX_TIMER_1_RG_AREA_EADDR 0x0221007f +#define C66XX_TIMER_1_RG_AREA_LEN (C66XX_TIMER_1_RG_AREA_EADDR - C66XX_TIMER_1_RG_AREA_SADDR + 1) + +// Timer2 registers area - 128B +#define C66XX_TIMER_2_RG_AREA_SADDR 0x02220000 +#define C66XX_TIMER_2_RG_AREA_EADDR 0x0222007f +#define C66XX_TIMER_2_RG_AREA_LEN (C66XX_TIMER_2_RG_AREA_EADDR - C66XX_TIMER_2_RG_AREA_SADDR + 1) + +// Timer3 registers area - 128B +#define C66XX_TIMER_3_RG_AREA_SADDR 0x02230000 +#define C66XX_TIMER_3_RG_AREA_EADDR 0x0223007f +#define C66XX_TIMER_3_RG_AREA_LEN (C66XX_TIMER_3_RG_AREA_EADDR - C66XX_TIMER_3_RG_AREA_SADDR + 1) + +// Timer4 registers area - 128B +#define C66XX_TIMER_4_RG_AREA_SADDR 0x02240000 +#define C66XX_TIMER_4_RG_AREA_EADDR 0x0224007f +#define C66XX_TIMER_4_RG_AREA_LEN (C66XX_TIMER_4_RG_AREA_EADDR - C66XX_TIMER_4_RG_AREA_SADDR + 1) + +// Timer5 registers area - 128B +#define C66XX_TIMER_5_RG_AREA_SADDR 0x02250000 +#define C66XX_TIMER_5_RG_AREA_EADDR 0x0225007f +#define C66XX_TIMER_5_RG_AREA_LEN (C66XX_TIMER_5_RG_AREA_EADDR - C66XX_TIMER_5_RG_AREA_SADDR + 1) + +// Timer6 registers area - 128B +#define C66XX_TIMER_6_RG_AREA_SADDR 0x02260000 +#define C66XX_TIMER_6_RG_AREA_EADDR 0x0226007f +#define C66XX_TIMER_6_RG_AREA_LEN (C66XX_TIMER_6_RG_AREA_EADDR - C66XX_TIMER_6_RG_AREA_SADDR + 1) + +// Timer7 registers area - 128B +#define C66XX_TIMER_7_RG_AREA_SADDR 0x02270000 +#define C66XX_TIMER_7_RG_AREA_EADDR 0x0227007f +#define C66XX_TIMER_7_RG_AREA_LEN (C66XX_TIMER_7_RG_AREA_EADDR - C66XX_TIMER_7_RG_AREA_SADDR + 1) + +// Timer8 registers area - 128B +#define C66XX_TIMER_8_RG_AREA_SADDR 0x02280000 +#define C66XX_TIMER_8_RG_AREA_EADDR 0x0228007f +#define C66XX_TIMER_8_RG_AREA_LEN (C66XX_TIMER_8_RG_AREA_EADDR - C66XX_TIMER_8_RG_AREA_SADDR + 1) + +// Timer9 registers area - 128B +#define C66XX_TIMER_9_RG_AREA_SADDR 0x02290000 +#define C66XX_TIMER_9_RG_AREA_EADDR 0x0229007f +#define C66XX_TIMER_9_RG_AREA_LEN (C66XX_TIMER_9_RG_AREA_EADDR - C66XX_TIMER_9_RG_AREA_SADDR + 1) + +// Timer10 registers area - 128B +#define C66XX_TIMER_10_RG_AREA_SADDR 0x022a0000 +#define C66XX_TIMER_10_RG_AREA_EADDR 0x022a007f +#define C66XX_TIMER_10_RG_AREA_LEN (C66XX_TIMER_10_RG_AREA_EADDR - C66XX_TIMER_10_RG_AREA_SADDR + 1) + +// Timer11 registers area - 128B +#define C66XX_TIMER_11_RG_AREA_SADDR 0x022b0000 +#define C66XX_TIMER_11_RG_AREA_EADDR 0x022b007f +#define C66XX_TIMER_11_RG_AREA_LEN (C66XX_TIMER_11_RG_AREA_EADDR - C66XX_TIMER_11_RG_AREA_SADDR + 1) + +// Timer12 registers area - 128B +#define C66XX_TIMER_12_RG_AREA_SADDR 0x022c0000 +#define C66XX_TIMER_12_RG_AREA_EADDR 0x022c007f +#define C66XX_TIMER_12_RG_AREA_LEN (C66XX_TIMER_12_RG_AREA_EADDR - C66XX_TIMER_12_RG_AREA_SADDR + 1) + +// Timer13 registers area - 128B +#define C66XX_TIMER_13_RG_AREA_SADDR 0x022d0000 +#define C66XX_TIMER_13_RG_AREA_EADDR 0x022d007f +#define C66XX_TIMER_13_RG_AREA_LEN (C66XX_TIMER_13_RG_AREA_EADDR - C66XX_TIMER_13_RG_AREA_SADDR + 1) + +// Timer14 registers area - 128B +#define C66XX_TIMER_14_RG_AREA_SADDR 0x022e0000 +#define C66XX_TIMER_14_RG_AREA_EADDR 0x022e007f +#define C66XX_TIMER_14_RG_AREA_LEN (C66XX_TIMER_14_RG_AREA_EADDR - C66XX_TIMER_14_RG_AREA_SADDR + 1) + +// Timer15 registers area - 128B +#define C66XX_TIMER_15_RG_AREA_SADDR 0x022f0000 +#define C66XX_TIMER_15_RG_AREA_EADDR 0x022f007f +#define C66XX_TIMER_15_RG_AREA_LEN (C66XX_TIMER_15_RG_AREA_EADDR - C66XX_TIMER_15_RG_AREA_SADDR + 1) + +// PLL controller registers area - 512B +#define C66XX_PLL_RG_AREA_SADDR 0x02310000 +#define C66XX_PLL_RG_AREA_EADDR 0x023101ff +#define C66XX_PLL_RG_AREA_LEN (C66XX_PLL_RG_AREA_EADDR - C66XX_PLL_RG_AREA_SADDR + 1) + +// GPIO registers area - 256B +#define C66XX_GPIO_RG_AREA_SADDR 0x02320000 +#define C66XX_GPIO_RG_AREA_EADDR 0x023200ff +#define C66XX_GPIO_RG_AREA_LEN (C66XX_GPIO_RG_AREA_EADDR - C66XX_GPIO_RG_AREA_SADDR + 1) + +// SmartReflex registers area - 256B +#define C66XX_SMARTREFLEX_RG_AREA_SADDR 0x02330000 +#define C66XX_SMARTREFLEX_RG_AREA_EADDR 0x023303ff +#define C66XX_SMARTREFLEX_RG_AREA_LEN (C66XX_SMARTREFLEX_RG_AREA_EADDR - C66XX_SMARTREFLEX_RG_AREA_SADDR + 1) + +// Power Sleep Controller (PSC) registers area - 4KB +#define C66XX_PSC_RG_AREA_SADDR 0x02350000 +#define C66XX_PSC_RG_AREA_EADDR 0x02350fff +#define C66XX_PSC_RG_AREA_LEN (C66XX_PSC_RG_AREA_EADDR - C66XX_PSC_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 0 registers area - 1KB +#define C66XX_MPU_0_RG_AREA_SADDR 0x02360000 +#define C66XX_MPU_0_RG_AREA_EADDR 0x023603ff +#define C66XX_MPU_0_RG_AREA_LEN (C66XX_MPU_0_RG_AREA_EADDR - C66XX_MPU_0_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 1 registers area - 1KB +#define C66XX_MPU_1_RG_AREA_SADDR 0x02368000 +#define C66XX_MPU_1_RG_AREA_EADDR 0x023683ff +#define C66XX_MPU_1_RG_AREA_LEN (C66XX_MPU_1_RG_AREA_EADDR - C66XX_MPU_1_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 2 registers area - 1KB +#define C66XX_MPU_2_RG_AREA_SADDR 0x02370000 +#define C66XX_MPU_2_RG_AREA_EADDR 0x023703ff +#define C66XX_MPU_2_RG_AREA_LEN (C66XX_MPU_2_RG_AREA_EADDR - C66XX_MPU_2_RG_AREA_SADDR + 1) + +// Memory Protection Unit (MPU) 3 registers area - 1KB +#define C66XX_MPU_3_RG_AREA_SADDR 0x02378000 +#define C66XX_MPU_3_RG_AREA_EADDR 0x023783ff +#define C66XX_MPU_3_RG_AREA_LEN (C66XX_MPU_3_RG_AREA_EADDR - C66XX_MPU_3_RG_AREA_SADDR + 1) + +// Debug subsystem configuration registers area - 256KB +#define C66XX_DEBUG_CFG_RG_AREA_SADDR 0x02400000 +#define C66XX_DEBUG_CFG_RG_AREA_EADDR 0x0243ffff +#define C66XX_DEBUG_CFG_RG_AREA_LEN (C66XX_DEBUG_CFG_RG_AREA_EADDR - C66XX_DEBUG_CFG_RG_AREA_SADDR + 1) + +// DSP trace formatter 0 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_SADDR 0x02440000 +#define C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_EADDR 0x02443fff +#define C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_0_RG_AREA_SADDR + 1) + +// DSP trace formatter 1 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_SADDR 0x02450000 +#define C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_EADDR 0x02453fff +#define C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_1_RG_AREA_SADDR + 1) + +// DSP trace formatter 2 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_SADDR 0x02460000 +#define C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_EADDR 0x02463fff +#define C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_2_RG_AREA_SADDR + 1) + +// DSP trace formatter 3 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_SADDR 0x02470000 +#define C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_EADDR 0x02473fff +#define C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_3_RG_AREA_SADDR + 1) + +// DSP trace formatter 4 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_SADDR 0x02480000 +#define C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_EADDR 0x02483fff +#define C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_4_RG_AREA_SADDR + 1) + +// DSP trace formatter 5 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_SADDR 0x02490000 +#define C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_EADDR 0x02493fff +#define C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_5_RG_AREA_SADDR + 1) + +// DSP trace formatter 6 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_SADDR 0x024a0000 +#define C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_EADDR 0x024a3fff +#define C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_6_RG_AREA_SADDR + 1) + +// DSP trace formatter 7 registers area - 16KB +#define C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_SADDR 0x024b0000 +#define C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_EADDR 0x024b3fff +#define C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_LEN (C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_EADDR - C66XX_DSP_TRACE_FORMATTER_7_RG_AREA_SADDR + 1) + +// I2C registers area - 128B +#define C66XX_I2C_RG_AREA_SADDR 0x02530000 +#define C66XX_I2C_RG_AREA_EADDR 0x0253007f +#define C66XX_I2C_RG_AREA_LEN (C66XX_I2C_RG_AREA_EADDR - C66XX_I2C_RG_AREA_SADDR + 1) + +// UART registers area - 64B +#define C66XX_UART_RG_AREA_SADDR 0x02540000 +#define C66XX_UART_RG_AREA_EADDR 0x0254003f +#define C66XX_UART_RG_AREA_LEN (C66XX_UART_RG_AREA_EADDR - C66XX_UART_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 0 registers area - 8KB +#define C66XX_CIC_0_RG_AREA_SADDR 0x02600000 +#define C66XX_CIC_0_RG_AREA_EADDR 0x02601fff +#define C66XX_CIC_0_RG_AREA_LEN (C66XX_CIC_0_RG_AREA_EADDR - C66XX_CIC_0_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 1 registers area - 8KB +#define C66XX_CIC_1_RG_AREA_SADDR 0x02604000 +#define C66XX_CIC_1_RG_AREA_EADDR 0x02605fff +#define C66XX_CIC_1_RG_AREA_LEN (C66XX_CIC_1_RG_AREA_EADDR - C66XX_CIC_1_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 2 registers area - 8KB +#define C66XX_CIC_2_RG_AREA_SADDR 0x02608000 +#define C66XX_CIC_2_RG_AREA_EADDR 0x02609fff +#define C66XX_CIC_2_RG_AREA_LEN (C66XX_CIC_2_RG_AREA_EADDR - C66XX_CIC_2_RG_AREA_SADDR + 1) + +// Chip Interrupt Controller (CIC) 3 registers area - 8KB +#define C66XX_CIC_3_RG_AREA_SADDR 0x0260c000 +#define C66XX_CIC_3_RG_AREA_EADDR 0x0260dfff +#define C66XX_CIC_3_RG_AREA_LEN (C66XX_CIC_3_RG_AREA_EADDR - C66XX_CIC_3_RG_AREA_SADDR + 1) + +// Device State Control registers area - 2KB +#define C66XX_BOOTCFG_RG_AREA_SADDR 0x02620000 +#define C66XX_BOOTCFG_RG_AREA_EADDR 0x026207ff +#define C66XX_BOOTCFG_RG_AREA_LEN (C66XX_BOOTCFG_RG_AREA_EADDR - C66XX_BOOTCFG_RG_AREA_SADDR + 1) + +// Semaphore (SEM) registers area - 2KB +#define C66XX_SEM_RG_AREA_SADDR 0x02640000 +#define C66XX_SEM_RG_AREA_EADDR 0x026407ff +#define C66XX_SEM_RG_AREA_LEN (C66XX_SEM_RG_AREA_EADDR - C66XX_SEM_RG_AREA_SADDR + 1) + +// EDMA3 Channel Controller (EDMA3CC) 0 registers area - 32KB +#define C66XX_EDMA3CC_0_RG_AREA_SADDR 0x02700000 +#define C66XX_EDMA3CC_0_RG_AREA_EADDR 0x02707fff +#define C66XX_EDMA3CC_0_RG_AREA_LEN (C66XX_EDMA3CC_0_RG_AREA_EADDR - C66XX_EDMA3CC_0_RG_AREA_SADDR + 1) + +// EDMA3 Channel Controller (EDMA3CC) 1 registers area - 32KB +#define C66XX_EDMA3CC_1_RG_AREA_SADDR 0x02720000 +#define C66XX_EDMA3CC_1_RG_AREA_EADDR 0x02727fff +#define C66XX_EDMA3CC_1_RG_AREA_LEN (C66XX_EDMA3CC_1_RG_AREA_EADDR - C66XX_EDMA3CC_1_RG_AREA_SADDR + 1) + +// EDMA3 Channel Controller (EDMA3CC) 2 registers area - 32KB +#define C66XX_EDMA3CC_2_RG_AREA_SADDR 0x02740000 +#define C66XX_EDMA3CC_2_RG_AREA_EADDR 0x02747fff +#define C66XX_EDMA3CC_2_RG_AREA_LEN (C66XX_EDMA3CC_2_RG_AREA_EADDR - C66XX_EDMA3CC_2_RG_AREA_SADDR + 1) + +// EDMA3CC0 Transfer Controller (EDMA3TC) 0 registers area - 1KB +#define C66XX_EDMA3CC_0_TC_0_RG_AREA_SADDR 0x02760000 +#define C66XX_EDMA3CC_0_TC_0_RG_AREA_EADDR 0x027603ff +#define C66XX_EDMA3CC_0_TC_0_RG_AREA_LEN (C66XX_EDMA3CC_0_TC_0_RG_AREA_EADDR - C66XX_EDMA3CC_0_TC_0_RG_AREA_SADDR + 1) + +// EDMA3CC0 Transfer Controller (EDMA3TC) 1 registers area - 1KB +#define C66XX_EDMA3CC_0_TC_1_RG_AREA_SADDR 0x02768000 +#define C66XX_EDMA3CC_0_TC_1_RG_AREA_EADDR 0x027683ff +#define C66XX_EDMA3CC_0_TC_1_RG_AREA_LEN (C66XX_EDMA3CC_0_TC_1_RG_AREA_EADDR - C66XX_EDMA3CC_0_TC_1_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 0 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_0_RG_AREA_SADDR 0x02770000 +#define C66XX_EDMA3CC_1_TC_0_RG_AREA_EADDR 0x027703ff +#define C66XX_EDMA3CC_1_TC_0_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_0_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_0_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 1 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_1_RG_AREA_SADDR 0x02778000 +#define C66XX_EDMA3CC_1_TC_1_RG_AREA_EADDR 0x027783ff +#define C66XX_EDMA3CC_1_TC_1_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_1_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_1_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 2 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_2_RG_AREA_SADDR 0x02780000 +#define C66XX_EDMA3CC_1_TC_2_RG_AREA_EADDR 0x027803ff +#define C66XX_EDMA3CC_1_TC_2_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_2_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_2_RG_AREA_SADDR + 1) + +// EDMA3CC1 Transfer Controller (EDMA3TC) 3 registers area - 1KB +#define C66XX_EDMA3CC_1_TC_3_RG_AREA_SADDR 0x02788000 +#define C66XX_EDMA3CC_1_TC_3_RG_AREA_EADDR 0x027883ff +#define C66XX_EDMA3CC_1_TC_3_RG_AREA_LEN (C66XX_EDMA3CC_1_TC_3_RG_AREA_EADDR - C66XX_EDMA3CC_1_TC_3_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 0 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_0_RG_AREA_SADDR 0x02790000 +#define C66XX_EDMA3CC_2_TC_0_RG_AREA_EADDR 0x027903ff +#define C66XX_EDMA3CC_2_TC_0_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_0_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_0_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 1 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_1_RG_AREA_SADDR 0x02798000 +#define C66XX_EDMA3CC_2_TC_1_RG_AREA_EADDR 0x027983ff +#define C66XX_EDMA3CC_2_TC_1_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_1_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_1_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 2 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_2_RG_AREA_SADDR 0x027a0000 +#define C66XX_EDMA3CC_2_TC_2_RG_AREA_EADDR 0x027a03ff +#define C66XX_EDMA3CC_2_TC_2_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_2_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_2_RG_AREA_SADDR + 1) + +// EDMA3CC2 Transfer Controller (EDMA3TC) 3 registers area - 1KB +#define C66XX_EDMA3CC_2_TC_3_RG_AREA_SADDR 0x027a8000 +#define C66XX_EDMA3CC_2_TC_3_RG_AREA_EADDR 0x027a83ff +#define C66XX_EDMA3CC_2_TC_3_RG_AREA_LEN (C66XX_EDMA3CC_2_TC_3_RG_AREA_EADDR - C66XX_EDMA3CC_2_TC_3_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac0 registers area - 4KB +#define C66XX_TETB_0_RG_AREA_SADDR 0x027d0000 +#define C66XX_TETB_0_RG_AREA_EADDR 0x027d0fff +#define C66XX_TETB_0_RG_AREA_LEN (C66XX_TETB_0_RG_AREA_EADDR - C66XX_TETB_0_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac1 registers area - 4KB +#define C66XX_TETB_1_RG_AREA_SADDR 0x027e0000 +#define C66XX_TETB_1_RG_AREA_EADDR 0x027e0fff +#define C66XX_TETB_1_RG_AREA_LEN (C66XX_TETB_1_RG_AREA_EADDR - C66XX_TETB_1_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac2 registers area - 4KB +#define C66XX_TETB_2_RG_AREA_SADDR 0x027f0000 +#define C66XX_TETB_2_RG_AREA_EADDR 0x027f0fff +#define C66XX_TETB_2_RG_AREA_LEN (C66XX_TETB_2_RG_AREA_EADDR - C66XX_TETB_2_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac3 registers area - 4KB +#define C66XX_TETB_3_RG_AREA_SADDR 0x02800000 +#define C66XX_TETB_3_RG_AREA_EADDR 0x02800fff +#define C66XX_TETB_3_RG_AREA_LEN (C66XX_TETB_3_RG_AREA_EADDR - C66XX_TETB_3_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac4 registers area - 4KB +#define C66XX_TETB_4_RG_AREA_SADDR 0x02810000 +#define C66XX_TETB_4_RG_AREA_EADDR 0x02810fff +#define C66XX_TETB_4_RG_AREA_LEN (C66XX_TETB_4_RG_AREA_EADDR - C66XX_TETB_4_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac5 registers area - 4KB +#define C66XX_TETB_5_RG_AREA_SADDR 0x02820000 +#define C66XX_TETB_5_RG_AREA_EADDR 0x02820fff +#define C66XX_TETB_5_RG_AREA_LEN (C66XX_TETB_5_RG_AREA_EADDR - C66XX_TETB_5_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac6 registers area - 4KB +#define C66XX_TETB_6_RG_AREA_SADDR 0x02830000 +#define C66XX_TETB_6_RG_AREA_EADDR 0x02830fff +#define C66XX_TETB_6_RG_AREA_LEN (C66XX_TETB_6_RG_AREA_EADDR - C66XX_TETB_6_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) CorePac7 registers area - 4KB +#define C66XX_TETB_7_RG_AREA_SADDR 0x02840000 +#define C66XX_TETB_7_RG_AREA_EADDR 0x02840fff +#define C66XX_TETB_7_RG_AREA_LEN (C66XX_TETB_7_RG_AREA_EADDR - C66XX_TETB_7_RG_AREA_SADDR + 1) + +// TI embedded trace buffer (TETB) system registers area - 32KB +#define C66XX_TETB_SYSTEM_RG_AREA_SADDR 0x02850000 +#define C66XX_TETB_SYSTEM_RG_AREA_EADDR 0x02857fff +#define C66XX_TETB_SYSTEM_RG_AREA_LEN (C66XX_TETB_SYSTEM_RG_AREA_EADDR - C66XX_TETB_SYSTEM_RG_AREA_SADDR + 1) + +// Serial RapidIO (SRIO) configuration registers area - 132KB +#define C66XX_SRIO_RG_AREA_SADDR 0x02900000 +#define C66XX_SRIO_RG_AREA_EADDR 0x02920fff +#define C66XX_SRIO_RG_AREA_LEN (C66XX_SRIO_RG_AREA_EADDR - C66XX_SRIO_RG_AREA_SADDR + 1) + +// Queue manager subsystem (QMSS) configuration registers area - 2MB +#define C66XX_QMSS_RG_AREA_SADDR 0x02a00000 +#define C66XX_QMSS_RG_AREA_EADDR 0x02bfffff +#define C66XX_QMSS_RG_AREA_LEN (C66XX_QMSS_RG_AREA_EADDR - C66XX_QMSS_RG_AREA_SADDR + 1) + +// Extended memory controller (XMC) configuration registers area - 64KB +#define C66XX_XMC_RG_AREA_SADDR 0x08000000 +#define C66XX_XMC_RG_AREA_EADDR 0x0800ffff +#define C66XX_XMC_RG_AREA_LEN (C66XX_XMC_RG_AREA_EADDR - C66XX_XMC_RG_AREA_SADDR + 1) + +// Multicore shared memory controller (MSMC) configuration registers area - 1MB +#define C66XX_MSMC_RG_AREA_SADDR 0x0bc00000 +#define C66XX_MSMC_RG_AREA_EADDR 0x0bcfffff +#define C66XX_MSMC_RG_AREA_LEN (C66XX_MSMC_RG_AREA_EADDR - C66XX_MSMC_RG_AREA_SADDR + 1) + +// Multicore shared memory (MSM) area - 4MB +#define C66XX_MSM_SRAM_AREA_SADDR 0x0c000000 +#define C66XX_MSM_SRAM_AREA_EADDR 0x0c3fffff +#define C66XX_MSM_SRAM_AREA_LEN (C66XX_MSM_SRAM_AREA_EADDR - C66XX_MSM_SRAM_AREA_SADDR + 1) + +// CorePac0 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_0_L2_SRAM_SADDR 0x10800000 +#define C66XX_DSP_0_L2_SRAM_EADDR 0x1087ffff +#define C66XX_DSP_0_L2_SRAM_LEN (C66XX_DSP_0_L2_SRAM_EADDR - C66XX_DSP_0_L2_SRAM_SADDR + 1) + +// CorePac0 L1P SRAM - 32KB +#define C66XX_DSP_0_L1P_SRAM_SADDR 0x10e00000 +#define C66XX_DSP_0_L1P_SRAM_EADDR 0x10e07fff +#define C66XX_DSP_0_L1P_SRAM_LEN (C66XX_DSP_0_L1P_SRAM_EADDR - C66XX_DSP_0_L1P_SRAM_SADDR + 1) + +// CorePac0 L1D SRAM - 32KB +#define C66XX_DSP_0_L1D_SRAM_SADDR 0x10f00000 +#define C66XX_DSP_0_L1D_SRAM_EADDR 0x10f07fff +#define C66XX_DSP_0_L1D_SRAM_LEN (C66XX_DSP_0_L1D_SRAM_EADDR - C66XX_DSP_0_L1D_SRAM_SADDR + 1) + +// CorePac1 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_1_L2_SRAM_SADDR 0x11800000 +#define C66XX_DSP_1_L2_SRAM_EADDR 0x1187ffff +#define C66XX_DSP_1_L2_SRAM_LEN (C66XX_DSP_1_L2_SRAM_EADDR - C66XX_DSP_1_L2_SRAM_SADDR + 1) + +// CorePac1 L1P SRAM - 32KB +#define C66XX_DSP_1_L1P_SRAM_SADDR 0x11e00000 +#define C66XX_DSP_1_L1P_SRAM_EADDR 0x11e07fff +#define C66XX_DSP_1_L1P_SRAM_LEN (C66XX_DSP_1_L1P_SRAM_EADDR - C66XX_DSP_1_L1P_SRAM_SADDR + 1) + +// CorePac1 L1D SRAM - 32KB +#define C66XX_DSP_1_L1D_SRAM_SADDR 0x11f00000 +#define C66XX_DSP_1_L1D_SRAM_EADDR 0x11f07fff +#define C66XX_DSP_1_L1D_SRAM_LEN (C66XX_DSP_1_L1D_SRAM_EADDR - C66XX_DSP_1_L1D_SRAM_SADDR + 1) + +// CorePac2 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_2_L2_SRAM_SADDR 0x12800000 +#define C66XX_DSP_2_L2_SRAM_EADDR 0x1287ffff +#define C66XX_DSP_2_L2_SRAM_LEN (C66XX_DSP_2_L2_SRAM_EADDR - C66XX_DSP_2_L2_SRAM_SADDR + 1) + +// CorePac2 L1P SRAM - 32KB +#define C66XX_DSP_2_L1P_SRAM_SADDR 0x12e00000 +#define C66XX_DSP_2_L1P_SRAM_EADDR 0x12e07fff +#define C66XX_DSP_2_L1P_SRAM_LEN (C66XX_DSP_2_L1P_SRAM_EADDR - C66XX_DSP_2_L1P_SRAM_SADDR + 1) + +// CorePac2 L1D SRAM - 32KB +#define C66XX_DSP_2_L1D_SRAM_SADDR 0x12f00000 +#define C66XX_DSP_2_L1D_SRAM_EADDR 0x12f07fff +#define C66XX_DSP_2_L1D_SRAM_LEN (C66XX_DSP_2_L1D_SRAM_EADDR - C66XX_DSP_2_L1D_SRAM_SADDR + 1) + +// CorePac3 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_3_L2_SRAM_SADDR 0x13800000 +#define C66XX_DSP_3_L2_SRAM_EADDR 0x1387ffff +#define C66XX_DSP_3_L2_SRAM_LEN (C66XX_DSP_3_L2_SRAM_EADDR - C66XX_DSP_3_L2_SRAM_SADDR + 1) + +// CorePac3 L1P SRAM - 32KB +#define C66XX_DSP_3_L1P_SRAM_SADDR 0x13e00000 +#define C66XX_DSP_3_L1P_SRAM_EADDR 0x13e07fff +#define C66XX_DSP_3_L1P_SRAM_LEN (C66XX_DSP_3_L1P_SRAM_EADDR - C66XX_DSP_3_L1P_SRAM_SADDR + 1) + +// CorePac3 L1D SRAM - 32KB +#define C66XX_DSP_3_L1D_SRAM_SADDR 0x13f00000 +#define C66XX_DSP_3_L1D_SRAM_EADDR 0x13f07fff +#define C66XX_DSP_3_L1D_SRAM_LEN (C66XX_DSP_3_L1D_SRAM_EADDR - C66XX_DSP_3_L1D_SRAM_SADDR + 1) + +// CorePac4 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_4_L2_SRAM_SADDR 0x14800000 +#define C66XX_DSP_4_L2_SRAM_EADDR 0x1487ffff +#define C66XX_DSP_4_L2_SRAM_LEN (C66XX_DSP_4_L2_SRAM_EADDR - C66XX_DSP_4_L2_SRAM_SADDR + 1) + +// CorePac4 L1P SRAM - 32KB +#define C66XX_DSP_4_L1P_SRAM_SADDR 0x14e00000 +#define C66XX_DSP_4_L1P_SRAM_EADDR 0x14e07fff +#define C66XX_DSP_4_L1P_SRAM_LEN (C66XX_DSP_4_L1P_SRAM_EADDR - C66XX_DSP_4_L1P_SRAM_SADDR + 1) + +// CorePac4 L1D SRAM - 32KB +#define C66XX_DSP_4_L1D_SRAM_SADDR 0x14f00000 +#define C66XX_DSP_4_L1D_SRAM_EADDR 0x14f07fff +#define C66XX_DSP_4_L1D_SRAM_LEN (C66XX_DSP_4_L1D_SRAM_EADDR - C66XX_DSP_4_L1D_SRAM_SADDR + 1) + +// CorePac5 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_5_L2_SRAM_SADDR 0x15800000 +#define C66XX_DSP_5_L2_SRAM_EADDR 0x1587ffff +#define C66XX_DSP_5_L2_SRAM_LEN (C66XX_DSP_5_L2_SRAM_EADDR - C66XX_DSP_5_L2_SRAM_SADDR + 1) + +// CorePac5 L1P SRAM - 32KB +#define C66XX_DSP_5_L1P_SRAM_SADDR 0x15e00000 +#define C66XX_DSP_5_L1P_SRAM_EADDR 0x15e07fff +#define C66XX_DSP_5_L1P_SRAM_LEN (C66XX_DSP_5_L1P_SRAM_EADDR - C66XX_DSP_5_L1P_SRAM_SADDR + 1) + +// CorePac5 L1D SRAM - 32KB +#define C66XX_DSP_5_L1D_SRAM_SADDR 0x15f00000 +#define C66XX_DSP_5_L1D_SRAM_EADDR 0x15f07fff +#define C66XX_DSP_5_L1D_SRAM_LEN (C66XX_DSP_5_L1D_SRAM_EADDR - C66XX_DSP_5_L1D_SRAM_SADDR + 1) + +// CorePac6 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_6_L2_SRAM_SADDR 0x16800000 +#define C66XX_DSP_6_L2_SRAM_EADDR 0x1687ffff +#define C66XX_DSP_6_L2_SRAM_LEN (C66XX_DSP_6_L2_SRAM_EADDR - C66XX_DSP_6_L2_SRAM_SADDR + 1) + +// CorePac6 L1P SRAM - 32KB +#define C66XX_DSP_6_L1P_SRAM_SADDR 0x16e00000 +#define C66XX_DSP_6_L1P_SRAM_EADDR 0x16e07fff +#define C66XX_DSP_6_L1P_SRAM_LEN (C66XX_DSP_6_L1P_SRAM_EADDR - C66XX_DSP_6_L1P_SRAM_SADDR + 1) + +// CorePac6 L1D SRAM - 32KB +#define C66XX_DSP_6_L1D_SRAM_SADDR 0x16f00000 +#define C66XX_DSP_6_L1D_SRAM_EADDR 0x16f07fff +#define C66XX_DSP_6_L1D_SRAM_LEN (C66XX_DSP_6_L1D_SRAM_EADDR - C66XX_DSP_6_L1D_SRAM_SADDR + 1) + +// CorePac7 L2 SRAM (address to access from external masters) - 512KB +#define C66XX_DSP_7_L2_SRAM_SADDR 0x17800000 +#define C66XX_DSP_7_L2_SRAM_EADDR 0x1787ffff +#define C66XX_DSP_7_L2_SRAM_LEN (C66XX_DSP_7_L2_SRAM_EADDR - C66XX_DSP_7_L2_SRAM_SADDR + 1) + +// CorePac7 L1P SRAM - 32KB +#define C66XX_DSP_7_L1P_SRAM_SADDR 0x17e00000 +#define C66XX_DSP_7_L1P_SRAM_EADDR 0x17e07fff +#define C66XX_DSP_7_L1P_SRAM_LEN (C66XX_DSP_7_L1P_SRAM_EADDR - C66XX_DSP_7_L1P_SRAM_SADDR + 1) + +// CorePac7 L1D SRAM - 32KB +#define C66XX_DSP_7_L1D_SRAM_SADDR 0x17f00000 +#define C66XX_DSP_7_L1D_SRAM_EADDR 0x17f07fff +#define C66XX_DSP_7_L1D_SRAM_LEN (C66XX_DSP_7_L1D_SRAM_EADDR - C66XX_DSP_7_L1D_SRAM_SADDR + 1) + +// System trace manager (STM) configuration registers area - 1MB +#define C66XX_STM_RG_AREA_SADDR 0x20000000 +#define C66XX_STM_RG_AREA_EADDR 0x200fffff +#define C66XX_STM_RG_AREA_LEN (C66XX_STM_RG_AREA_EADDR - C66XX_STM_RG_AREA_SADDR + 1) + +// Boot ROM - 128KB +#define C66XX_BOOT_ROM_SADDR 0x20b00000 +#define C66XX_BOOT_ROM_EADDR 0x20b1ffff +#define C66XX_BOOT_ROM_LEN (C66XX_BOOT_ROM_EADDR - C66XX_BOOT_ROM_SADDR + 1) + +// SPI configuration registers area - 512B +#define C66XX_SPI_RG_AREA_SADDR 0x20bf0000 +#define C66XX_SPI_RG_AREA_EADDR 0x20bf01ff +#define C66XX_SPI_RG_AREA_LEN (C66XX_SPI_RG_AREA_EADDR - C66XX_SPI_RG_AREA_SADDR + 1) + +// EMIF16 configuration registers area - 256B +#define C66XX_EMIF16_RG_AREA_SADDR 0x20c00000 +#define C66XX_EMIF16_RG_AREA_EADDR 0x20c000ff +#define C66XX_EMIF16_RG_AREA_LEN (C66XX_EMIF16_RG_AREA_EADDR - C66XX_EMIF16_RG_AREA_SADDR + 1) + +// DDR3 EMIF configuration registers area - 512B +#define C66XX_DDR3_EMIF_RG_AREA_SADDR 0x21000000 +#define C66XX_DDR3_EMIF_RG_AREA_EADDR 0x210001ff +#define C66XX_DDR3_EMIF_RG_AREA_LEN (C66XX_DDR3_EMIF_RG_AREA_EADDR - C66XX_DDR3_EMIF_RG_AREA_SADDR + 1) + +// HyperLink configuration registers area - 256B +#define C66XX_HYPERLINK_RG_AREA_SADDR 0x21400000 +#define C66XX_HYPERLINK_RG_AREA_EADDR 0x214000ff +#define C66XX_HYPERLINK_RG_AREA_LEN (C66XX_HYPERLINK_RG_AREA_EADDR - C66XX_HYPERLINK_RG_AREA_SADDR + 1) + +// PCIe configuration registers area - 32KB +#define C66XX_PCIE_RG_AREA_SADDR 0x21800000 +#define C66XX_PCIE_RG_AREA_EADDR 0x21807fff +#define C66XX_PCIE_RG_AREA_LEN (C66XX_PCIE_RG_AREA_EADDR - C66XX_PCIE_RG_AREA_SADDR + 1) + +// Queue manager subsystem (QMSS) data area - 2MB +#define C66XX_QMSS_DATA_AREA_SADDR 0x34000000 +#define C66XX_QMSS_DATA_AREA_EADDR 0x341fffff +#define C66XX_QMSS_DATA_AREA_LEN (C66XX_QMSS_DATA_AREA_EADDR - C66XX_QMSS_DATA_AREA_SADDR + 1) + +// HyperLink data area - 256MB +#define C66XX_HYPERLINK_DATA_AREA_SADDR 0x40000000 +#define C66XX_HYPERLINK_DATA_AREA_EADDR 0x4fffffff +#define C66XX_HYPERLINK_DATA_AREA_LEN (C66XX_HYPERLINK_DATA_AREA_EADDR - C66XX_HYPERLINK_DATA_AREA_SADDR + 1) + +// PCIe data area - 256MB +#define C66XX_PCIE_DATA_AREA_SADDR 0x60000000 +#define C66XX_PCIE_DATA_AREA_EADDR 0x6fffffff +#define C66XX_PCIE_DATA_AREA_LEN (C66XX_PCIE_DATA_AREA_EADDR - C66XX_PCIE_DATA_AREA_SADDR + 1) + +// EMIF16 CE0 area - 64MB +#define C66XX_EMIF16_CE0_AREA_SADDR 0x70000000 +#define C66XX_EMIF16_CE0_AREA_EADDR 0x73ffffff +#define C66XX_EMIF16_CE0_AREA_LEN (C66XX_EMIF16_CE0_AREA_EADDR - C66XX_EMIF16_CE0_AREA_SADDR + 1) + +// EMIF16 CE1 area - 64MB +#define C66XX_EMIF16_CE1_AREA_SADDR 0x74000000 +#define C66XX_EMIF16_CE1_AREA_EADDR 0x77ffffff +#define C66XX_EMIF16_CE1_AREA_LEN (C66XX_EMIF16_CE1_AREA_EADDR - C66XX_EMIF16_CE1_AREA_SADDR + 1) + +// EMIF16 CE2 area - 64MB +#define C66XX_EMIF16_CE2_AREA_SADDR 0x78000000 +#define C66XX_EMIF16_CE2_AREA_EADDR 0x7bffffff +#define C66XX_EMIF16_CE2_AREA_LEN (C66XX_EMIF16_CE2_AREA_EADDR - C66XX_EMIF16_CE2_AREA_SADDR + 1) + +// EMIF16 CE3 area - 64MB +#define C66XX_EMIF16_CE3_AREA_SADDR 0x7c000000 +#define C66XX_EMIF16_CE3_AREA_EADDR 0x7fffffff +#define C66XX_EMIF16_CE3_AREA_LEN (C66XX_EMIF16_CE3_AREA_EADDR - C66XX_EMIF16_CE3_AREA_SADDR + 1) + +// DDR3 EMIF data area - 2GB +#define C66XX_DDR3_AREA_SADDR 0x80000000 +#define C66XX_DDR3_AREA_EADDR 0xffffffff +#define C66XX_DDR3_AREA_LEN (C66XX_DDR3_AREA_EADDR - C66XX_DDR3_AREA_SADDR + 1) + +//============================================================================= +#endif /* __C66XX_SELECT_C6678_DSP__ */ + + + +//============================================================================= +//============ DSP core registers ============================================= +//============================================================================= +// DSP CorePack revision register - r-only +#define C66XX_CORE_MM_REVID_RG_ADDR 0x01812000 + +//------------ DSP CorePack revision register defs ---------------------------- +#define C66XX_CORE_MM_REVID_VERSION_BITMASK 0xffff0000 +#define C66XX_CORE_MM_REVID_VERSION_BITSHIFT 16 +#define C66XX_CORE_MM_REVID_REVISION_BITMASK 0x0000ffff +#define C66XX_CORE_MM_REVID_REVISION_BITSHIFT 0 + +#define C66XX_CORE_MM_REVID_VERSION_C6678 0x0008 +#define C66XX_CORE_MM_REVID_REVISION_1_0 0x0 +#define C66XX_CORE_MM_REVID_REVISION_2_0 0x1 + + +// DSP interrupt controller registers addresses + +// DSP Event Flag register 0 - r-only +#define C66XX_CORE_EVTFLAG0_RG_ADDR 0x01800000 +// DSP Event Flag register 1 - r-only +#define C66XX_CORE_EVTFLAG1_RG_ADDR 0x01800004 +// DSP Event Flag register 2 - r-only +#define C66XX_CORE_EVTFLAG2_RG_ADDR 0x01800008 +// DSP Event Flag register 3 - r-only +#define C66XX_CORE_EVTFLAG3_RG_ADDR 0x0180000c +// DSP Event Set register 0 - r/w +#define C66XX_CORE_EVTSET0_RG_ADDR 0x01800020 +// DSP Event Set register 1 - r/w +#define C66XX_CORE_EVTSET1_RG_ADDR 0x01800024 +// DSP Event Set register 2 - r/w +#define C66XX_CORE_EVTSET2_RG_ADDR 0x01800028 +// DSP Event Set register 3 - r/w +#define C66XX_CORE_EVTSET3_RG_ADDR 0x0180002c +// DSP Event Clear register 0 - r/w +#define C66XX_CORE_EVTCLR0_RG_ADDR 0x01800040 +// DSP Event Clear register 1 - r/w +#define C66XX_CORE_EVTCLR1_RG_ADDR 0x01800044 +// DSP Event Clear register 2 - r/w +#define C66XX_CORE_EVTCLR2_RG_ADDR 0x01800048 +// DSP Event Clear register 3 - r/w +#define C66XX_CORE_EVTCLR3_RG_ADDR 0x0180004c +// DSP Event Mask register 0 - r/w +#define C66XX_CORE_EVTMASK0_RG_ADDR 0x01800080 +// DSP Event Mask register 1 - r/w +#define C66XX_CORE_EVTMASK1_RG_ADDR 0x01800084 +// DSP Event Mask register 2 - r/w +#define C66XX_CORE_EVTMASK2_RG_ADDR 0x01800088 +// DSP Event Mask register 3 - r/w +#define C66XX_CORE_EVTMASK3_RG_ADDR 0x0180008c + +// DSP Event Flag registers base address +#define C66XX_CORE_EVTFLAG_RG_BADDR 0x01800000 +// DSP Event Flag registers offset +#define C66XX_CORE_EVTFLAG_RG_OFFSET 0x00000004 + +// DSP Event Set registers base address +#define C66XX_CORE_EVTSET_RG_BADDR 0x01800020 +// DSP Event Set registers offset +#define C66XX_CORE_EVTSET_RG_OFFSET 0x00000004 + +// DSP Event Clear registers base address +#define C66XX_CORE_EVTCLR_RG_BADDR 0x01800040 +// DSP Event Clear registers offset +#define C66XX_CORE_EVTCLR_RG_OFFSET 0x00000004 + +// DSP Event Mask registers base address +#define C66XX_CORE_EVTMASK_RG_BADDR 0x01800080 +// DSP Event Mask registers offset +#define C66XX_CORE_EVTMASK_RG_OFFSET 0x00000004 + +//============================================================================= + + + +//============================================================================= +//============ PLL controller registers ======================================= +//============================================================================= +// PLL control register - r/w +#define C66XX_PLL_PLLCTL_RG_OFFSET 0x100 +// PLL secondary control register - r/w +#define C66XX_PLL_SECCTL_RG_OFFSET 0x108 +// PLL multiplier control register - r/w +#define C66XX_PLL_PLLM_RG_OFFSET 0x110 +// PLL controller divider 1 register - r/w +#define C66XX_PLL_PLLDIV1_RG_OFFSET 0x118 +// PLL controller divider 2 register - r/w +#define C66XX_PLL_PLLDIV2_RG_OFFSET 0x11c +// PLL controller divider 3 register - r/w +#define C66XX_PLL_PLLDIV3_RG_OFFSET 0x120 +// PLL controller command register - r/w +#define C66XX_PLL_PLLCMD_RG_OFFSET 0x138 +// PLL controller status register - r/w +#define C66XX_PLL_PLLSTAT_RG_OFFSET 0x13c +// PLL controller clock align control register - r/w +#define C66XX_PLL_ALNCTL_RG_OFFSET 0x140 +// PLL controller divider ratio change status register - r/w +#define C66XX_PLL_DCHANGE_RG_OFFSET 0x144 +// SYSCLK status register - r-only +#define C66XX_PLL_SYSTAT_RG_OFFSET 0x150 +// PLL controller divider 4 register - r/w +#define C66XX_PLL_PLLDIV4_RG_OFFSET 0x160 +// PLL controller divider 5 register - r/w +#define C66XX_PLL_PLLDIV5_RG_OFFSET 0x164 +// PLL controller divider 6 register - r/w +#define C66XX_PLL_PLLDIV6_RG_OFFSET 0x168 +// PLL controller divider 7 register - r/w +#define C66XX_PLL_PLLDIV7_RG_OFFSET 0x16c +// PLL controller divider 8 register - r/w +#define C66XX_PLL_PLLDIV8_RG_OFFSET 0x170 +// PLL controller divider 9 register - r/w +#define C66XX_PLL_PLLDIV9_RG_OFFSET 0x174 +// PLL controller divider 10 register - r/w +#define C66XX_PLL_PLLDIV10_RG_OFFSET 0x178 +// PLL controller divider 11 register - r/w +#define C66XX_PLL_PLLDIV11_RG_OFFSET 0x17c +// PLL controller divider 12 register - r/w +#define C66XX_PLL_PLLDIV12_RG_OFFSET 0x180 +// PLL controller divider 13 register - r/w +#define C66XX_PLL_PLLDIV13_RG_OFFSET 0x184 +// PLL controller divider 14 register - r/w +#define C66XX_PLL_PLLDIV14_RG_OFFSET 0x188 +// PLL controller divider 15 register - r/w +#define C66XX_PLL_PLLDIV15_RG_OFFSET 0x18c +// PLL controller divider 16 register - r/w +#define C66XX_PLL_PLLDIV16_RG_OFFSET 0x190 + +#define C66XX_PLL_PLLCTL_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLCTL_RG_OFFSET) +#define C66XX_PLL_SECCTL_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_SECCTL_RG_OFFSET) +#define C66XX_PLL_PLLM_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLM_RG_OFFSET) +#define C66XX_PLL_PLLDIV1_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV1_RG_OFFSET) +#define C66XX_PLL_PLLDIV2_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV2_RG_OFFSET) +#define C66XX_PLL_PLLDIV3_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV3_RG_OFFSET) +#define C66XX_PLL_PLLCMD_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLCMD_RG_OFFSET) +#define C66XX_PLL_PLLSTAT_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLSTAT_RG_OFFSET) +#define C66XX_PLL_ALNCTL_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_ALNCTL_RG_OFFSET) +#define C66XX_PLL_DCHANGE_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_DCHANGE_RG_OFFSET) +#define C66XX_PLL_SYSTAT_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_SYSTAT_RG_OFFSET) +#define C66XX_PLL_PLLDIV4_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV4_RG_OFFSET) +#define C66XX_PLL_PLLDIV5_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV5_RG_OFFSET) +#define C66XX_PLL_PLLDIV6_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV6_RG_OFFSET) +#define C66XX_PLL_PLLDIV7_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV7_RG_OFFSET) +#define C66XX_PLL_PLLDIV8_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV8_RG_OFFSET) +#define C66XX_PLL_PLLDIV9_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV9_RG_OFFSET) +#define C66XX_PLL_PLLDIV10_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV10_RG_OFFSET) +#define C66XX_PLL_PLLDIV11_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV11_RG_OFFSET) +#define C66XX_PLL_PLLDIV12_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV12_RG_OFFSET) +#define C66XX_PLL_PLLDIV13_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV13_RG_OFFSET) +#define C66XX_PLL_PLLDIV14_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV14_RG_OFFSET) +#define C66XX_PLL_PLLDIV15_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV15_RG_OFFSET) +#define C66XX_PLL_PLLDIV16_RG_ADDR (C66XX_PLL_RG_AREA_SADDR + C66XX_PLL_PLLDIV16_RG_OFFSET) + + +//------------ PLL control register defs -------------------------------------- +#define C66XX_PLL_PLLCTL_PLLENSRC_BITMASK 0x20 +#define C66XX_PLL_PLLCTL_PLLENSRC_BITSHIFT 5 +#define C66XX_PLL_PLLCTL_PLLRST_BITMASK 0x8 +#define C66XX_PLL_PLLCTL_PLLRST_BITSHIFT 3 +#define C66XX_PLL_PLLCTL_PLLPWRDN_BITMASK 0x2 +#define C66XX_PLL_PLLCTL_PLLPWRDN_BITSHIFT 1 +#define C66XX_PLL_PLLCTL_PLLEN_BITMASK 0x1 +#define C66XX_PLL_PLLCTL_PLLEN_BITSHIFT 0 + + +//------------ PLL secondary control register defs ---------------------------- +#define C66XX_PLL_SECCTL_BYPASS_BITMASK 0x00800000 +#define C66XX_PLL_SECCTL_BYPASS_BITSHIFT 23 +#define C66XX_PLL_SECCTL_OUTPUT_DIVIDE_BITMASK 0x00780000 +#define C66XX_PLL_SECCTL_OUTPUT_DIVIDE_BITSHIFT 19 + + +//------------ PLL multiplier control register defs --------------------------- +#define C66XX_PLL_PLLM_PLLM_BITMASK 0x3f +#define C66XX_PLL_PLLM_PLLM_BITSHIFT 0 + + +//------------ PLL controller divider registers defs -------------------------- +#define C66XX_PLL_PLLDIV_DEN_BITMASK 0x8000 +#define C66XX_PLL_PLLDIV_DEN_BITSHIFT 15 +#define C66XX_PLL_PLLDIV_RATIO_BITMASK 0xff +#define C66XX_PLL_PLLDIV_RATIO_BITSHIFT 0 + + +//------------ PLL controller command register defs --------------------------- +#define C66XX_PLL_PLLCMD_GOSET_BITMASK 0x1 +#define C66XX_PLL_PLLCMD_GOSET_BITSHIFT 0 + + +//------------ PLL controller status register defs ---------------------------- +#define C66XX_PLL_PLLSTAT_GOSTAT_BITMASK 0x1 +#define C66XX_PLL_PLLSTAT_GOSTAT_BITSHIFT 0 + + +//------------ PLL controller clock align control register defs --------------- +#define C66XX_PLL_ALNCTL_ALN_BITMASK 0xffff +#define C66XX_PLL_ALNCTL_ALN_BITSHIFT 0 + + +//------------ PLL controller divider ratio change status register defs ------- +#define C66XX_PLL_DCHANGE_SYS_BITMASK 0xffff +#define C66XX_PLL_DCHANGE_SYS_BITSHIFT 0 + + +//------------ SYSCLK status register defs ------------------------------------ +#define C66XX_PLL_SYSTAT_SYSON_BITMASK 0xffff +#define C66XX_PLL_SYSTAT_SYSON_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ Device State Control registers ================================= +//============================================================================= +/* + * !!! Note that this section contains only those definitions + * that are missed in TI C6000 Chip Support Library (CSL) !!! + */ + +// JTAG ID register - r-only +#define C66XX_BOOTCFG_JTAGID_RG_OFFSET 0x18 +// Device status register - r/w +#define C66XX_BOOTCFG_DEVSTAT_RG_OFFSET 0x20 +// Boot kicker 0 register - r/w +#define C66XX_BOOTCFG_KICK0_RG_OFFSET 0x38 +// Boot kicker 1 register - r/w +#define C66XX_BOOTCFG_KICK1_RG_OFFSET 0x3c +// DSP0 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR0_RG_OFFSET 0x40 +// DSP1 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR1_RG_OFFSET 0x44 +// DSP2 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR2_RG_OFFSET 0x48 +// DSP3 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR3_RG_OFFSET 0x4c +// DSP4 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR4_RG_OFFSET 0x50 +// DSP5 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR5_RG_OFFSET 0x54 +// DSP6 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR6_RG_OFFSET 0x58 +// DSP7 boot address register - r/w +#define C66XX_BOOTCFG_DSP_BOOT_ADDR7_RG_OFFSET 0x5c +// MAC 1 address register - r-only +#define C66XX_BOOTCFG_MACID1_RG_OFFSET 0x110 +// MAC 2 address register - r-only +#define C66XX_BOOTCFG_MACID2_RG_OFFSET 0x114 +// LRESETNMI PIN status clear register - r/w +#define C66XX_BOOTCFG_LRSTNMIPINSTAT_CLR_RG_OFFSET 0x130 +// Reset status clear register - r/w +#define C66XX_BOOTCFG_RESET_STAT_CLR_RG_OFFSET 0x134 +// Boot complete register - r/w +#define C66XX_BOOTCFG_BOOTCOMPLETE_RG_OFFSET 0x13c +// Reset status register - r-only +#define C66XX_BOOTCFG_RESET_STAT_RG_OFFSET 0x144 +// LRESETNMI PIN status register - r-only +#define C66XX_BOOTCFG_LRSTNMIPINSTAT_RG_OFFSET 0x148 +// Device configuration register - r/w +#define C66XX_BOOTCFG_DEVCFG_RG_OFFSET 0x14c +// Power state control register - r/w +#define C66XX_BOOTCFG_PWRSTATECTL_RG_OFFSET 0x150 +// SRIO SerDes macro status register - r-only +#define C66XX_BOOTCFG_SRIO_SERDES_STS_RG_OFFSET 0x154 +// SMGII SerDes macro status register - r-only +#define C66XX_BOOTCFG_SMGII_SERDES_STS_RG_OFFSET 0x158 +// PCIe SerDes macro status register - r-only +#define C66XX_BOOTCFG_PCIE_SERDES_STS_RG_OFFSET 0x15c +// HyperLink SerDes macro status register - r-only +#define C66XX_BOOTCFG_HYPERLINK_SERDES_STS_RG_OFFSET 0x160 +// NMI generation for CorePac0 register - r/w +#define C66XX_BOOTCFG_NMIGR0_RG_OFFSET 0x200 +// NMI generation for CorePac1 register - r/w +#define C66XX_BOOTCFG_NMIGR1_RG_OFFSET 0x204 +// NMI generation for CorePac2 register - r/w +#define C66XX_BOOTCFG_NMIGR2_RG_OFFSET 0x208 +// NMI generation for CorePac3 register - r/w +#define C66XX_BOOTCFG_NMIGR3_RG_OFFSET 0x20c +// NMI generation for CorePac4 register - r/w +#define C66XX_BOOTCFG_NMIGR4_RG_OFFSET 0x210 +// NMI generation for CorePac5 register - r/w +#define C66XX_BOOTCFG_NMIGR5_RG_OFFSET 0x214 +// NMI generation for CorePac6 register - r/w +#define C66XX_BOOTCFG_NMIGR6_RG_OFFSET 0x218 +// NMI generation for CorePac7 register - r/w +#define C66XX_BOOTCFG_NMIGR7_RG_OFFSET 0x21c +// IPC generation for CorePac0 register - r/w +#define C66XX_BOOTCFG_IPCGR0_RG_OFFSET 0x240 +// IPC generation for CorePac1 register - r/w +#define C66XX_BOOTCFG_IPCGR1_RG_OFFSET 0x244 +// IPC generation for CorePac2 register - r/w +#define C66XX_BOOTCFG_IPCGR2_RG_OFFSET 0x248 +// IPC generation for CorePac3 register - r/w +#define C66XX_BOOTCFG_IPCGR3_RG_OFFSET 0x24c +// IPC generation for CorePac4 register - r/w +#define C66XX_BOOTCFG_IPCGR4_RG_OFFSET 0x250 +// IPC generation for CorePac5 register - r/w +#define C66XX_BOOTCFG_IPCGR5_RG_OFFSET 0x254 +// IPC generation for CorePac6 register - r/w +#define C66XX_BOOTCFG_IPCGR6_RG_OFFSET 0x258 +// IPC generation for CorePac7 register - r/w +#define C66XX_BOOTCFG_IPCGR7_RG_OFFSET 0x25c + +// Timer Input Selection register - r/w +#define C66XX_BOOTCFG_TINPSEL_RG_OFFSET 0x300 +// Timer Output Selection register - r/w +#define C66XX_BOOTCFG_TOUTPSEL_RG_OFFSET 0x304 + +// Main PLL Control register 0 - r/w +#define C66XX_BOOTCFG_MAINPLLCTL0_RG_OFFSET 0x328 +// Main PLL Control register 1 - r/w +#define C66XX_BOOTCFG_MAINPLLCTL1_RG_OFFSET 0x32c +// DDR3 PLL Control register 0 - r/w +#define C66XX_BOOTCFG_DDR3PLLCTL0_RG_OFFSET 0x330 +// DDR3 PLL Control register 1 - r/w +#define C66XX_BOOTCFG_DDR3PLLCTL1_RG_OFFSET 0x334 +// Pass PLL Control register 0 - r/w +#define C66XX_BOOTCFG_PASSPLLCTL0_RG_OFFSET 0x338 +// Pass PLL Control register 1 - r/w +#define C66XX_BOOTCFG_PASSPLLCTL1_RG_OFFSET 0x33c +// Device speed register - r-only +#define C66XX_BOOTCFG_DEVSPEED_RG_OFFSET 0x3f8 + +#define C66XX_BOOTCFG_TINPSEL_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_TINPSEL_RG_OFFSET) +#define C66XX_BOOTCFG_TOUTPSEL_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_TOUTPSEL_RG_OFFSET) +#define C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_MAINPLLCTL0_RG_OFFSET) +#define C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_MAINPLLCTL1_RG_OFFSET) +#define C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_DDR3PLLCTL0_RG_OFFSET) +#define C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_DDR3PLLCTL1_RG_OFFSET) +#define C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_PASSPLLCTL0_RG_OFFSET) +#define C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_PASSPLLCTL1_RG_OFFSET) +#define C66XX_BOOTCFG_DEVSPEED_RG_ADDR (C66XX_BOOTCFG_RG_AREA_SADDR + C66XX_BOOTCFG_DEVSPEED_RG_OFFSET) + + +//------------ Main PLL Control register 0 defs ------------------------------- +#define C66XX_BOOTCFG_MAINPLLCTL0_BWADJ_BITMASK 0xff000000 +#define C66XX_BOOTCFG_MAINPLLCTL0_BWADJ_BITSHIFT 24 +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLM_BITMASK 0x7f000 +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLM_BITSHIFT 12 +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLD_BITMASK 0x3f +#define C66XX_BOOTCFG_MAINPLLCTL0_PLLD_BITSHIFT 0 + + +//------------ Main PLL Control register 1 defs ------------------------------- +#define C66XX_BOOTCFG_MAINPLLCTL1_ENSAT_BITMASK 0x40 +#define C66XX_BOOTCFG_MAINPLLCTL1_ENSAT_BITSHIFT 6 +#define C66XX_BOOTCFG_MAINPLLCTL1_BWADJ_BITMASK 0xf +#define C66XX_BOOTCFG_MAINPLLCTL1_BWADJ_BITSHIFT 0 + + +//------------ DDR3 PLL Control register 0 defs ------------------------------- +#define C66XX_BOOTCFG_DDR3PLLCTL0_BWADJ_BITMASK 0xff000000 +#define C66XX_BOOTCFG_DDR3PLLCTL0_BWADJ_BITSHIFT 24 +#define C66XX_BOOTCFG_DDR3PLLCTL0_BYPASS_BITMASK 0x800000 +#define C66XX_BOOTCFG_DDR3PLLCTL0_BYPASS_BITSHIFT 23 +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLM_BITMASK 0x7ffc0 +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLM_BITSHIFT 6 +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLD_BITMASK 0x3f +#define C66XX_BOOTCFG_DDR3PLLCTL0_PLLD_BITSHIFT 0 + + +//------------ DDR3 PLL Control register 1 defs ------------------------------- +#define C66XX_BOOTCFG_DDR3PLLCTL1_PLLRST_BITMASK 0x2000 +#define C66XX_BOOTCFG_DDR3PLLCTL1_PLLRST_BITSHIFT 13 +#define C66XX_BOOTCFG_DDR3PLLCTL1_ENSAT_BITMASK 0x40 +#define C66XX_BOOTCFG_DDR3PLLCTL1_ENSAT_BITSHIFT 6 +#define C66XX_BOOTCFG_DDR3PLLCTL1_BWADJ_BITMASK 0xf +#define C66XX_BOOTCFG_DDR3PLLCTL1_BWADJ_BITSHIFT 0 + + +//------------ PASS PLL Control register 0 defs ------------------------------- +#define C66XX_BOOTCFG_PASSPLLCTL0_BWADJ_BITMASK 0xff000000 +#define C66XX_BOOTCFG_PASSPLLCTL0_BWADJ_BITSHIFT 24 +#define C66XX_BOOTCFG_PASSPLLCTL0_BYPASS_BITMASK 0x800000 +#define C66XX_BOOTCFG_PASSPLLCTL0_BYPASS_BITSHIFT 23 +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLM_BITMASK 0x7ffc0 +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLM_BITSHIFT 6 +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLD_BITMASK 0x3f +#define C66XX_BOOTCFG_PASSPLLCTL0_PLLD_BITSHIFT 0 + + +//------------ PASS PLL Control register 1 defs ------------------------------- +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLRST_BITMASK 0x4000 +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLRST_BITSHIFT 14 +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLSELECT_BITMASK 0x2000 +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLSELECT_BITSHIFT 13 +#define C66XX_BOOTCFG_PASSPLLCTL1_ENSAT_BITMASK 0x40 +#define C66XX_BOOTCFG_PASSPLLCTL1_ENSAT_BITSHIFT 6 +#define C66XX_BOOTCFG_PASSPLLCTL1_BWADJ_BITMASK 0xf +#define C66XX_BOOTCFG_PASSPLLCTL1_BWADJ_BITSHIFT 0 + + +//------------ Device speed register defs ------------------------------------- +#define C66XX_BOOTCFG_DEVSPEED_DEVSPEED_BITMASK 0xff800000 +#define C66XX_BOOTCFG_DEVSPEED_DEVSPEED_BITSHIFT 23 + +// DSP core speed defs in MHz +#define C66XX_DSP_CORE_SPEED_800MHZ 800 +#define C66XX_DSP_CORE_SPEED_1000MHZ 1000 +#define C66XX_DSP_CORE_SPEED_1200MHZ 1200 +#define C66XX_DSP_CORE_SPEED_1250MHZ 1250 +#define C66XX_DSP_CORE_SPEED_1400MHZ 1400 + + +//------------ MACID2 register defs ------------------------------------------- +#define C66XX_BOOTCFG_MACID2_MACID_BITMASK 0xffff +#define C66XX_BOOTCFG_MACID2_MACID_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ Power & sleep controller definitions =========================== +//============================================================================= +/* + * !!! Note that this section contains only those definitions + * that are missed in TI C6000 Chip Support Library (CSL) !!! + */ + +// Power Domains Definitions +#define C66XX_PSC_PD_ALWAYSON 0 +#define C66XX_PSC_PD_TETB 1 +#define C66XX_PSC_PD_PA 2 +#define C66XX_PSC_PD_PCIE 3 +#define C66XX_PSC_PD_SRIO 4 +#define C66XX_PSC_PD_HYPERLINK 5 +#define C66XX_PSC_PD_MSM_SRAM 7 +#define C66XX_PSC_PD_DSP0 8 +#define C66XX_PSC_PD_DSP1 9 +#define C66XX_PSC_PD_DSP2 10 +#define C66XX_PSC_PD_DSP3 11 +#define C66XX_PSC_PD_DSP4 12 +#define C66XX_PSC_PD_DSP5 13 +#define C66XX_PSC_PD_DSP6 14 +#define C66XX_PSC_PD_DSP7 15 +#define C66XX_PSC_PD_COUNT (C66XX_PSC_PD_DSP7 + 1) + +// Power Domains State Definitions +#define C66XX_PSC_PD_STATE_OFF PSC_PDSTATE_OFF +#define C66XX_PSC_PD_STATE_ON PSC_PDSTATE_ON + + +// Power & Sleep Controller Clock Domains Definitions +#define C66XX_PSC_LPSC_SHARED_LPSC 0 +#define C66XX_PSC_LPSC_SMARTREFLEX 1 +#define C66XX_PSC_LPSC_DDR3_EMIF 2 +#define C66XX_PSC_LPSC_EMIF16_SPI 3 +#define C66XX_PSC_LPSC_TSIP 4 +#define C66XX_PSC_LPSC_DEBUG_TRACE 5 +#define C66XX_PSC_LPSC_TETB 6 +#define C66XX_PSC_LPSC_PA 7 +#define C66XX_PSC_LPSC_ETHERNET 8 +#define C66XX_PSC_LPSC_SA 9 +#define C66XX_PSC_LPSC_PCIE 10 +#define C66XX_PSC_LPSC_SRIO 11 +#define C66XX_PSC_LPSC_HYPERLINK 12 +#define C66XX_PSC_LPSC_MSM_SRAM 14 +#define C66XX_PSC_LPSC_DSP0 15 +#define C66XX_PSC_LPSC_DSP1 16 +#define C66XX_PSC_LPSC_DSP2 17 +#define C66XX_PSC_LPSC_DSP3 18 +#define C66XX_PSC_LPSC_DSP4 19 +#define C66XX_PSC_LPSC_DSP5 20 +#define C66XX_PSC_LPSC_DSP6 21 +#define C66XX_PSC_LPSC_DSP7 22 +#define C66XX_PSC_LPSC_COUNT (C66XX_PSC_LPSC_DSP7 + 1) + +// Clock Domains State Definitions +#define C66XX_PSC_LPSC_STATE_OFF PSC_MODSTATE_SWRSTDISABLE +#define C66XX_PSC_LPSC_STATE_ON PSC_MODSTATE_ENABLE + +//============================================================================= + + + +//============================================================================= +//============ I2C definitions ================================================ +//============================================================================= +/* + * !!! Note that this section contains only those definitions + * that are missed in TI C6000 Chip Support Library (CSL) !!! + */ + +// I2C own address register - r/w +#define C66XX_I2C_ICOAR_RG_OFFSET 0x00 +// I2C interrupt mask register - r/w +#define C66XX_I2C_ICIMR_RG_OFFSET 0x04 +// I2C interrupt status register - r/w +#define C66XX_I2C_ICSTR_RG_OFFSET 0x08 +// I2C clock low-time divider register - r/w +#define C66XX_I2C_ICCLKL_RG_OFFSET 0x0c +// I2C clock high-time divider register - r/w +#define C66XX_I2C_ICCLKH_RG_OFFSET 0x10 +// I2C data count register - r/w +#define C66XX_I2C_ICCNT_RG_OFFSET 0x14 +// I2C data receive register - r-only +#define C66XX_I2C_ICDRR_RG_OFFSET 0x18 +// I2C slave address register - r/w +#define C66XX_I2C_ICSAR_RG_OFFSET 0x1c +// I2C data transmit register - r/w +#define C66XX_I2C_ICDXR_RG_OFFSET 0x20 +// I2C mode register - r/w +#define C66XX_I2C_ICMDR_RG_OFFSET 0x24 +// I2C interrupt vector register - r/w +#define C66XX_I2C_ICIVR_RG_OFFSET 0x28 +// I2C extended mode register - r/w +#define C66XX_I2C_ICEMDR_RG_OFFSET 0x2c +// I2C prescaler register - r/w +#define C66XX_I2C_ICPSC_RG_OFFSET 0x30 +// I2C peripheral identification 1 register - r/w +#define C66XX_I2C_ICPID1_RG_OFFSET 0x34 +// I2C peripheral identification 2 register - r/w +#define C66XX_I2C_ICPID2_RG_OFFSET 0x38 + +#define C66XX_I2C_ICOAR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICOAR_RG_OFFSET) +#define C66XX_I2C_ICIMR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICIMR_RG_OFFSET) +#define C66XX_I2C_ICSTR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICSTR_RG_OFFSET) +#define C66XX_I2C_ICCLKL_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICCLKL_RG_OFFSET) +#define C66XX_I2C_ICCLKH_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICCLKH_RG_OFFSET) +#define C66XX_I2C_ICCNT_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICCNT_RG_OFFSET) +#define C66XX_I2C_ICDRR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICDRR_RG_OFFSET) +#define C66XX_I2C_ICSAR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICSAR_RG_OFFSET) +#define C66XX_I2C_ICDXR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICDXR_RG_OFFSET) +#define C66XX_I2C_ICMDR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICMDR_RG_OFFSET) +#define C66XX_I2C_ICIVR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICIVR_RG_OFFSET) +#define C66XX_I2C_ICEMDR_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICEMDR_RG_OFFSET) +#define C66XX_I2C_ICPSC_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICPSC_RG_OFFSET) +#define C66XX_I2C_ICPID1_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICPID1_RG_OFFSET) +#define C66XX_I2C_ICPID2_RG_ADDR (C66XX_I2C_RG_AREA_SADDR + C66XX_I2C_ICPID2_RG_OFFSET) + + +//------------ I2C own address register defs ---------------------------------- +#define C66XX_I2C_ICOAR_OADDR_BITMASK 0x3ff +#define C66XX_I2C_ICOAR_OADDR_BITSHIFT 0 + + +//------------ I2C interrupt mask register defs ------------------------------- +#define C66XX_I2C_ICIMR_AAS_BITMASK 0x40 +#define C66XX_I2C_ICIMR_AAS_BITSHIFT 6 +#define C66XX_I2C_ICIMR_SCD_BITMASK 0x20 +#define C66XX_I2C_ICIMR_SCD_BITSHIFT 5 +#define C66XX_I2C_ICIMR_ICXRDY_BITMASK 0x10 +#define C66XX_I2C_ICIMR_ICXRDY_BITSHIFT 4 +#define C66XX_I2C_ICIMR_ICRDRDY_BITMASK 0x8 +#define C66XX_I2C_ICIMR_ICRDRDY_BITSHIFT 3 +#define C66XX_I2C_ICIMR_ARDY_BITMASK 0x4 +#define C66XX_I2C_ICIMR_ARDY_BITSHIFT 2 +#define C66XX_I2C_ICIMR_NACK_BITMASK 0x2 +#define C66XX_I2C_ICIMR_NACK_BITSHIFT 1 +#define C66XX_I2C_ICIMR_AL_BITMASK 0x1 +#define C66XX_I2C_ICIMR_AL_BITSHIFT 0 +#define C66XX_I2C_ICIMR_RG_BITMASK 0x7f + + +//------------ I2C interrupt status register defs ----------------------------- +#define C66XX_I2C_ICSTR_SDIR_BITMASK 0x4000 +#define C66XX_I2C_ICSTR_SDIR_BITSHIFT 14 +#define C66XX_I2C_ICSTR_NACKSNT_BITMASK 0x2000 +#define C66XX_I2C_ICSTR_NACKSNT_BITSHIFT 13 +#define C66XX_I2C_ICSTR_BB_BITMASK 0x1000 +#define C66XX_I2C_ICSTR_BB_BITSHIFT 12 +#define C66XX_I2C_ICSTR_RSFULL_BITMASK 0x800 +#define C66XX_I2C_ICSTR_RSFULL_BITSHIFT 11 +#define C66XX_I2C_ICSTR_XSMT_BITMASK 0x400 +#define C66XX_I2C_ICSTR_XSMT_BITSHIFT 10 +#define C66XX_I2C_ICSTR_AAS_BITMASK 0x200 +#define C66XX_I2C_ICSTR_AAS_BITSHIFT 9 +#define C66XX_I2C_ICSTR_AD0_BITMASK 0x100 +#define C66XX_I2C_ICSTR_AD0_BITSHIFT 8 +#define C66XX_I2C_ICSTR_SCD_BITMASK 0x20 +#define C66XX_I2C_ICSTR_SCD_BITSHIFT 5 +#define C66XX_I2C_ICSTR_ICXRDY_BITMASK 0x10 +#define C66XX_I2C_ICSTR_ICXRDY_BITSHIFT 4 +#define C66XX_I2C_ICSTR_ICRDRDY_BITMASK 0x8 +#define C66XX_I2C_ICSTR_ICRDRDY_BITSHIFT 3 +#define C66XX_I2C_ICSTR_ARDY_BITMASK 0x4 +#define C66XX_I2C_ICSTR_ARDY_BITSHIFT 2 +#define C66XX_I2C_ICSTR_NACK_BITMASK 0x2 +#define C66XX_I2C_ICSTR_NACK_BITSHIFT 1 +#define C66XX_I2C_ICSTR_AL_BITMASK 0x1 +#define C66XX_I2C_ICSTR_AL_BITSHIFT 0 + + +//------------ I2C clock low-time divider register defs ----------------------- +#define C66XX_I2C_ICCLKL_ICCL_BITMASK 0xffff +#define C66XX_I2C_ICCLKL_ICCL_BITSHIFT 0 + + +//------------ I2C clock high-time divider register defs ---------------------- +#define C66XX_I2C_ICCLKH_ICCH_BITMASK 0xffff +#define C66XX_I2C_ICCLKH_ICCH_BITSHIFT 0 + + +//------------ I2C data count register defs ----------------------------------- +#define C66XX_I2C_ICCNT_ICDC_BITMASK 0xffff +#define C66XX_I2C_ICCNT_ICDC_BITSHIFT 0 + + +//------------ I2C data receive register defs --------------------------------- +#define C66XX_I2C_ICDRR_D_BITMASK 0xff +#define C66XX_I2C_ICDRR_D_BITSHIFT 0 + + +//------------ I2C slave address register defs -------------------------------- +#define C66XX_I2C_ICSAR_SADDR_BITMASK 0x3ff +#define C66XX_I2C_ICSAR_SADDR_BITSHIFT 0 + + +//------------ I2C data transmit register defs -------------------------------- +#define C66XX_I2C_ICDXR_D_BITMASK 0xff +#define C66XX_I2C_ICDXR_D_BITSHIFT 0 + + +//------------ I2C mode register defs ----------------------------------------- +#define C66XX_I2C_ICMDR_NACKMOD_BITMASK 0x8000 +#define C66XX_I2C_ICMDR_NACKMOD_BITSHIFT 15 +#define C66XX_I2C_ICMDR_FREE_BITMASK 0x4000 +#define C66XX_I2C_ICMDR_FREE_BITSHIFT 14 +#define C66XX_I2C_ICMDR_STT_BITMASK 0x2000 +#define C66XX_I2C_ICMDR_STT_BITSHIFT 13 +#define C66XX_I2C_ICMDR_STP_BITMASK 0x800 +#define C66XX_I2C_ICMDR_STP_BITSHIFT 11 +#define C66XX_I2C_ICMDR_MST_BITMASK 0x400 +#define C66XX_I2C_ICMDR_MST_BITSHIFT 10 +#define C66XX_I2C_ICMDR_TRX_BITMASK 0x200 +#define C66XX_I2C_ICMDR_TRX_BITSHIFT 9 +#define C66XX_I2C_ICMDR_XA_BITMASK 0x100 +#define C66XX_I2C_ICMDR_XA_BITSHIFT 8 +#define C66XX_I2C_ICMDR_RM_BITMASK 0x80 +#define C66XX_I2C_ICMDR_RM_BITSHIFT 7 +#define C66XX_I2C_ICMDR_DLB_BITMASK 0x40 +#define C66XX_I2C_ICMDR_DLB_BITSHIFT 6 +#define C66XX_I2C_ICMDR_IRS_BITMASK 0x20 +#define C66XX_I2C_ICMDR_IRS_BITSHIFT 5 +#define C66XX_I2C_ICMDR_STB_BITMASK 0x10 +#define C66XX_I2C_ICMDR_STB_BITSHIFT 4 +#define C66XX_I2C_ICMDR_FDF_BITMASK 0x8 +#define C66XX_I2C_ICMDR_FDF_BITSHIFT 3 +#define C66XX_I2C_ICMDR_BC_BITMASK 0x7 +#define C66XX_I2C_ICMDR_BC_BITSHIFT 0 + + +//------------ I2C interrupt vector register defs ----------------------------- +#define C66XX_I2C_ICIVR_INTCODE_BITMASK 0x7 +#define C66XX_I2C_ICIVR_INTCODE_BITSHIFT 0 + + +//------------ I2C extended mode register defs -------------------------------- +#define C66XX_I2C_ICEMDR_IGNACK_BITMASK 0x2 +#define C66XX_I2C_ICEMDR_IGNACK_BITSHIFT 1 +#define C66XX_I2C_ICEMDR_BCM_BITMASK 0x1 +#define C66XX_I2C_ICEMDR_BCM_BITSHIFT 0 + + +//------------ I2C prescaler register defs ------------------------------------ +#define C66XX_I2C_ICPSC_IPSC_BITMASK 0xff +#define C66XX_I2C_ICPSC_IPSC_BITSHIFT 0 + + +//------------ I2C peripheral identification 1 register defs ------------------ +#define C66XX_I2C_ICPID1_CLASS_BITMASK 0xff00 +#define C66XX_I2C_ICPID1_CLASS_BITSHIFT 8 +#define C66XX_I2C_ICPID1_REVISION_BITMASK 0xff +#define C66XX_I2C_ICPID1_REVISION_BITSHIFT 0 + + +//------------ I2C peripheral identification 2 register defs ------------------ +#define C66XX_I2C_ICPID2_TYPE_BITMASK 0xffff +#define C66XX_I2C_ICPID2_TYPE_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ EMIF16 configuration registers ================================= +//============================================================================= +// Revision code and status register - r-only +#define C66XX_EMIF16_RCSR_RG_OFFSET 0x00 +// Async wait cycle config register - r/w +#define C66XX_EMIF16_AWCCR_RG_OFFSET 0x04 +// Async 1 (CE0) config register - r/w +#define C66XX_EMIF16_A1CR_RG_OFFSET 0x10 +// Async 2 (CE1) config register - r/w +#define C66XX_EMIF16_A2CR_RG_OFFSET 0x14 +// Async 3 (CE2) config register - r/w +#define C66XX_EMIF16_A3CR_RG_OFFSET 0x18 +// Async 4 (CE3) config register - r/w +#define C66XX_EMIF16_A4CR_RG_OFFSET 0x1c +// Interrupt raw register - r/w +#define C66XX_EMIF16_IRR_RG_OFFSET 0x40 +// Interrupt masked register - r/w +#define C66XX_EMIF16_IMR_RG_OFFSET 0x44 +// Interrupt mask set register - r/w +#define C66XX_EMIF16_IMSR_RG_OFFSET 0x48 +// Interrupt mask clear register - r/w +#define C66XX_EMIF16_IMCR_RG_OFFSET 0x4c +// Page mode control register - r/w +#define C66XX_EMIF16_PMCR_RG_OFFSET 0x68 + +#define C66XX_EMIF16_RCSR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_RCSR_RG_OFFSET) +#define C66XX_EMIF16_AWCCR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_AWCCR_RG_OFFSET) +#define C66XX_EMIF16_A1CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A1CR_RG_OFFSET) +#define C66XX_EMIF16_A2CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A2CR_RG_OFFSET) +#define C66XX_EMIF16_A3CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A3CR_RG_OFFSET) +#define C66XX_EMIF16_A4CR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_A4CR_RG_OFFSET) +#define C66XX_EMIF16_IRR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IRR_RG_OFFSET) +#define C66XX_EMIF16_IMR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IMR_RG_OFFSET) +#define C66XX_EMIF16_IMSR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IMSR_RG_OFFSET) +#define C66XX_EMIF16_IMCR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_IMCR_RG_OFFSET) +#define C66XX_EMIF16_PMCR_RG_ADDR (C66XX_EMIF16_RG_AREA_SADDR + C66XX_EMIF16_PMCR_RG_OFFSET) + + +//------------ Revision code and status register defs ------------------------- +#define C66XX_EMIF16_RCSR_BE_BITMASK 0x80000000 +#define C66XX_EMIF16_RCSR_BE_BITSHIFT 31 +#define C66XX_EMIF16_RCSR_MOD_ID_BITMASK 0x3fff0000 +#define C66XX_EMIF16_RCSR_MOD_ID_BITSHIFT 16 +#define C66XX_EMIF16_RCSR_MJ_REV_BITMASK 0xff00 +#define C66XX_EMIF16_RCSR_MJ_REV_BITSHIFT 8 +#define C66XX_EMIF16_RCSR_MIN_REV_BITMASK 0xff +#define C66XX_EMIF16_RCSR_MIN_REV_BITSHIFT 0 + +#define C66XX_EMIF16_RCSR_MOD_ID_DEFAULT_VALUE 0x46 +#define C66XX_EMIF16_RCSR_MJ_REV_DEFAULT_VALUE 0x4 +#define C66XX_EMIF16_RCSR_MIN_REV_DEFAULT_VALUE 0x0 + + +//------------ Async wait cycle config register defs -------------------------- +#define C66XX_EMIF16_AWCCR_WP1_BITMASK 0x20000000 +#define C66XX_EMIF16_AWCCR_WP1_BITSHIFT 29 +#define C66XX_EMIF16_AWCCR_WP0_BITMASK 0x10000000 +#define C66XX_EMIF16_AWCCR_WP0_BITSHIFT 28 +#define C66XX_EMIF16_AWCCR_CS5_WAIT_BITMASK 0xc00000 +#define C66XX_EMIF16_AWCCR_CS5_WAIT_BITSHIFT 22 +#define C66XX_EMIF16_AWCCR_CS4_WAIT_BITMASK 0x300000 +#define C66XX_EMIF16_AWCCR_CS4_WAIT_BITSHIFT 20 +#define C66XX_EMIF16_AWCCR_CS3_WAIT_BITMASK 0xc0000 +#define C66XX_EMIF16_AWCCR_CS3_WAIT_BITSHIFT 18 +#define C66XX_EMIF16_AWCCR_CS2_WAIT_BITMASK 0x30000 +#define C66XX_EMIF16_AWCCR_CS2_WAIT_BITSHIFT 16 +#define C66XX_EMIF16_AWCCR_MAX_EXT_WAIT_BITMASK 0xff +#define C66XX_EMIF16_AWCCR_MAX_EXT_WAIT_BITSHIFT 0 + + +//------------ Async 1 config register defs ----------------------------------- +#define C66XX_EMIF16_A1CR_SS_BITMASK 0x80000000 +#define C66XX_EMIF16_A1CR_SS_BITSHIFT 31 +#define C66XX_EMIF16_A1CR_EW_BITMASK 0x40000000 +#define C66XX_EMIF16_A1CR_EW_BITSHIFT 30 +#define C66XX_EMIF16_A1CR_W_SETUP_BITMASK 0x3c000000 +#define C66XX_EMIF16_A1CR_W_SETUP_BITSHIFT 26 +#define C66XX_EMIF16_A1CR_W_STROBE_BITMASK 0x3f00000 +#define C66XX_EMIF16_A1CR_W_STROBE_BITSHIFT 20 +#define C66XX_EMIF16_A1CR_W_HOLD_BITMASK 0xe0000 +#define C66XX_EMIF16_A1CR_W_HOLD_BITSHIFT 17 +#define C66XX_EMIF16_A1CR_R_SETUP_BITMASK 0x1e000 +#define C66XX_EMIF16_A1CR_R_SETUP_BITSHIFT 13 +#define C66XX_EMIF16_A1CR_R_STROBE_BITMASK 0x1f80 +#define C66XX_EMIF16_A1CR_R_STROBE_BITSHIFT 7 +#define C66XX_EMIF16_A1CR_R_HOLD_BITMASK 0x70 +#define C66XX_EMIF16_A1CR_R_HOLD_BITSHIFT 4 +#define C66XX_EMIF16_A1CR_TA_BITMASK 0xc +#define C66XX_EMIF16_A1CR_TA_BITSHIFT 2 +#define C66XX_EMIF16_A1CR_ASIZE_BITMASK 0x3 +#define C66XX_EMIF16_A1CR_ASIZE_BITSHIFT 0 + +#define C66XX_EMIF16_A1CR_ASIZE_8BIT 0 +#define C66XX_EMIF16_A1CR_ASIZE_16BIT 1 + + +//------------ Interrupt raw register defs ------------------------------------ +#define C66XX_EMIF16_IRR_WR_BITMASK 0x3c +#define C66XX_EMIF16_IRR_WR_BITSHIFT 2 +#define C66XX_EMIF16_IRR_AT_BITMASK 0x1 +#define C66XX_EMIF16_IRR_AT_BITSHIFT 0 + + +//------------ Interrupt masked register defs --------------------------------- +#define C66XX_EMIF16_IMR_WR_MASKED_BITMASK 0x3c +#define C66XX_EMIF16_IMR_WR_MASKED_BITSHIFT 2 +#define C66XX_EMIF16_IMR_AT_MASKED_BITMASK 0x1 +#define C66XX_EMIF16_IMR_AT_MASKED_BITSHIFT 0 + + +//------------ Interrupt mask set register defs ------------------------------- +#define C66XX_EMIF16_IMSR_WR_MASK_SET_BITMASK 0x3c +#define C66XX_EMIF16_IMSR_WR_MASK_SET_BITSHIFT 2 +#define C66XX_EMIF16_IMSR_AT_MASK_SET_BITMASK 0x1 +#define C66XX_EMIF16_IMSR_AT_MASK_SET_BITSHIFT 0 + + +//------------ Interrupt mask clear register defs ----------------------------- +#define C66XX_EMIF16_IMCR_WR_MASK_CLR_BITMASK 0x3c +#define C66XX_EMIF16_IMCR_WR_MASK_CLR_BITSHIFT 2 +#define C66XX_EMIF16_IMCR_AT_MASK_CLR_BITMASK 0x1 +#define C66XX_EMIF16_IMCR_AT_MASK_CLR_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +//============ Timer definitions ============================================== +//============================================================================= + +// Emulation Management and Clock Speed register - r-only +#define C66XX_TIMER_EMUMGT_CLKSPD_RG_OFFSET 0x0004 +// Counter register low register - r/w +#define C66XX_TIMER_CNTLO_RG_OFFSET 0x0010 +// Counter register high register - r/w +#define C66XX_TIMER_CNTHI_RG_OFFSET 0x0014 +// Period register low register - r/w +#define C66XX_TIMER_PRDLO_RG_OFFSET 0x0018 +// Period register high register - r/w +#define C66XX_TIMER_PRDHI_RG_OFFSET 0x001c +// Timer control register - r/w +#define C66XX_TIMER_TCR_RG_OFFSET 0x0020 +// Timer global control register - r/w +#define C66XX_TIMER_TGCR_RG_OFFSET 0x0024 +// Watchdog timer control register - r/w +#define C66XX_TIMER_WDTCR_RG_OFFSET 0x0028 +// Timer Reload register low register - r/w +#define C66XX_TIMER_RELLO_RG_OFFSET 0x0034 +// Timer Reload register high register - r/w +#define C66XX_TIMER_RELHI_RG_OFFSET 0x0038 +// Timer Capture register low register - r/w +#define C66XX_TIMER_CAPLO_RG_OFFSET 0x003c +// Timer Capture register high register - r/w +#define C66XX_TIMER_CAPHI_RG_OFFSET 0x0040 +// Timer interrupt control and status register - r/w +#define C66XX_TIMER_INTCTLSTAT_RG_OFFSET 0x0044 + +// Timer 0-15 registers area offset addresses +#define C66XX_TIMER_RG_AREA_OFFSET 0x00010000 +// Timer 0-15 registers addresses: timer = 0-15 +#define C66XX_TIMER_EMUMGT_CLKSPD_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_EMUMGT_CLKSPD_RG_OFFSET) +#define C66XX_TIMER_CNTLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CNTLO_RG_OFFSET) +#define C66XX_TIMER_CNTHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CNTHI_RG_OFFSET) +#define C66XX_TIMER_PRDLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_PRDLO_RG_OFFSET) +#define C66XX_TIMER_PRDHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_PRDHI_RG_OFFSET) +#define C66XX_TIMER_TCR_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_TCR_RG_OFFSET) +#define C66XX_TIMER_TGCR_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_TGCR_RG_OFFSET) +#define C66XX_TIMER_WDTCR_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_WDTCR_RG_OFFSET) +#define C66XX_TIMER_RELLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_RELLO_RG_OFFSET) +#define C66XX_TIMER_RELHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_RELHI_RG_OFFSET) +#define C66XX_TIMER_CAPLO_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CAPLO_RG_OFFSET) +#define C66XX_TIMER_CAPHI_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_CAPHI_RG_OFFSET) +#define C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer) (C66XX_TIMER_0_RG_AREA_SADDR + (timer * C66XX_TIMER_RG_AREA_OFFSET) + C66XX_TIMER_INTCTLSTAT_RG_OFFSET) + + +//------------ Emulation Management and Clock Speed register defs ------------- +#define C66XX_TIMER_EMUMGT_CLKSPD_CLKDIV_BITMASK 0x000f0000 +#define C66XX_TIMER_EMUMGT_CLKSPD_CLKDIV_BITSHIFT 16 + + +//------------ Timer control register defs ------------------------------------ +#define C66XX_TIMER_TCR_READRSTMODE_HI_BITMASK 0x04000000 +#define C66XX_TIMER_TCR_READRSTMODE_HI_BITSHIFT 26 +#define C66XX_TIMER_TCR_ENAMODE_HI_BITMASK 0x00c00000 +#define C66XX_TIMER_TCR_ENAMODE_HI_BITSHIFT 22 +#define C66XX_TIMER_TCR_PWID_HI_BITMASK 0x00300000 +#define C66XX_TIMER_TCR_PWID_HI_BITSHIFT 20 +#define C66XX_TIMER_TCR_CP_HI_BITMASK 0x00080000 +#define C66XX_TIMER_TCR_CP_HI_BITSHIFT 19 +#define C66XX_TIMER_TCR_INVOUTP_HI_BITMASK 0x00020000 +#define C66XX_TIMER_TCR_INVOUTP_HI_BITSHIFT 17 +#define C66XX_TIMER_TCR_TSTAT_HI_BITMASK 0x00010000 +#define C66XX_TIMER_TCR_TSTAT_HI_BITSHIFT 16 +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_BITMASK 0x00003000 +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_BITSHIFT 12 +#define C66XX_TIMER_TCR_CAPMODE_LO_BITMASK 0x00000800 +#define C66XX_TIMER_TCR_CAPMODE_LO_BITSHIFT 11 +#define C66XX_TIMER_TCR_READRSTMODE_LO_BITMASK 0x00000400 +#define C66XX_TIMER_TCR_READRSTMODE_LO_BITSHIFT 10 +#define C66XX_TIMER_TCR_TIEN_LO_BITMASK 0x00000200 +#define C66XX_TIMER_TCR_TIEN_LO_BITSHIFT 9 +#define C66XX_TIMER_TCR_CLKSRC_LO_BITMASK 0x00000100 +#define C66XX_TIMER_TCR_CLKSRC_LO_BITSHIFT 8 +#define C66XX_TIMER_TCR_ENAMODE_LO_BITMASK 0x000000c0 +#define C66XX_TIMER_TCR_ENAMODE_LO_BITSHIFT 6 +#define C66XX_TIMER_TCR_PWID_LO_BITMASK 0x00000030 +#define C66XX_TIMER_TCR_PWID_LO_BITSHIFT 4 +#define C66XX_TIMER_TCR_CP_LO_BITMASK 0x00000008 +#define C66XX_TIMER_TCR_CP_LO_BITSHIFT 3 +#define C66XX_TIMER_TCR_INVINP_LO_BITMASK 0x00000004 +#define C66XX_TIMER_TCR_INVINP_LO_BITSHIFT 2 +#define C66XX_TIMER_TCR_INVOUTP_LO_BITMASK 0x00000002 +#define C66XX_TIMER_TCR_INVOUTP_LO_BITSHIFT 1 +#define C66XX_TIMER_TCR_TSTAT_LO_BITMASK 0x00000001 +#define C66XX_TIMER_TCR_TSTAT_LO_BITSHIFT 0 + +#define C66XX_TIMER_TCR_ENAMODE_DISABLED 0 +#define C66XX_TIMER_TCR_ENAMODE_ONE_SHOT 1 +#define C66XX_TIMER_TCR_ENAMODE_CONT 2 +#define C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD 3 + +#define C66XX_TIMER_TCR_PWID_1_CLK 0 +#define C66XX_TIMER_TCR_PWID_2_CLK 1 +#define C66XX_TIMER_TCR_PWID_3_CLK 2 +#define C66XX_TIMER_TCR_PWID_4_CLK 3 + +#define C66XX_TIMER_TCR_CAPEVTMODE_RISING_EDGE 0 +#define C66XX_TIMER_TCR_CAPEVTMODE_FALLING_EDGE 1 +#define C66XX_TIMER_TCR_CAPEVTMODE_ANY_EDGE 2 + + +//------------ Timer global control register defs ----------------------------- +#define C66XX_TIMER_TGCR_TDDRHI_BITMASK 0x0000f000 +#define C66XX_TIMER_TGCR_TDDRHI_BITSHIFT 12 +#define C66XX_TIMER_TGCR_PSCHI_BITMASK 0x00000f00 +#define C66XX_TIMER_TGCR_PSCHI_BITSHIFT 8 +#define C66XX_TIMER_TGCR_PLUSEN_BITMASK 0x00000010 +#define C66XX_TIMER_TGCR_PLUSEN_BITSHIFT 4 +#define C66XX_TIMER_TGCR_TIMMODE_BITMASK 0x0000000c +#define C66XX_TIMER_TGCR_TIMMODE_BITSHIFT 2 +#define C66XX_TIMER_TGCR_TIMHIRS_BITMASK 0x00000002 +#define C66XX_TIMER_TGCR_TIMHIRS_BITSHIFT 1 +#define C66XX_TIMER_TGCR_TIMLORS_BITMASK 0x00000001 +#define C66XX_TIMER_TGCR_TIMLORS_BITSHIFT 0 + +#define C66XX_TIMER_TGCR_TIMMODE_64BIT_GPT 0 +#define C66XX_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED 1 +#define C66XX_TIMER_TGCR_TIMMODE_64BIT_WDT 2 +#define C66XX_TIMER_TGCR_TIMMODE_32BIT_CHAINED 3 + + +//------------ Watchdog Timer Control Register defs --------------------------- +#define C66XX_TIMER_WDTCR_WDKEY_BITMASK 0xffff0000 +#define C66XX_TIMER_WDTCR_WDKEY_BITSHIFT 16 +#define C66XX_TIMER_WDTCR_WDFLAG_BITMASK 0x00008000 +#define C66XX_TIMER_WDTCR_WDFLAG_BITSHIFT 15 +#define C66XX_TIMER_WDTCR_WDEN_BITMASK 0x00004000 +#define C66XX_TIMER_WDTCR_WDEN_BITSHIFT 14 + +#define C66XX_TIMER_WDTCR_WDKEY_FIRST_KEY 0xa5c6 +#define C66XX_TIMER_WDTCR_WDKEY_SECOND_KEY 0xda7e + + +//------------ Timer interrupt control and status register defs --------------- +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_HI_BITMASK 0x00080000 +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_HI_BITSHIFT 19 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_HI_BITMASK 0x00040000 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_HI_BITSHIFT 18 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_HI_BITMASK 0x00020000 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_HI_BITSHIFT 17 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_HI_BITMASK 0x00010000 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_HI_BITSHIFT 16 +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_LO_BITMASK 0x00000008 +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_LO_BITSHIFT 3 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_LO_BITMASK 0x00000004 +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_LO_BITSHIFT 2 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_LO_BITMASK 0x00000002 +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_LO_BITSHIFT 1 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_LO_BITMASK 0x00000001 +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_LO_BITSHIFT 0 + +//============================================================================= + + + +//============================================================================= +#endif /* __C66XX_DEF_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx b/ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx new file mode 100644 index 00000000..8564e44d --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX_FUNCTIONS.hxx @@ -0,0 +1,1693 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + (C) MicroLAB Systems, 2014-2015 + + File: C66xx DSP SDK API functions declarations + ----- + + Notes: + ------ + 1. This C-header file contains C66xx DSP SDK API functions declarations + and is used with C66XX.h C-header file. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file C66XX_FUNCTIONS.hxx + * + * @brief SDK API functions declarations + * + * This file contains C66xx DSP SDK API functions declarations + * + */ + + +#ifndef __C66XX_FUNCTIONS_HXX__ // check for this file has been already included +#define __C66XX_FUNCTIONS_HXX__ 1 + + + +//============================================================================= +//============ Returned error codes =========================================== +//============================================================================= +/** @addtogroup C66XX_ERRORS DSP SDK API returned error codes + * @{ + */ +#define C66XX_OK 0 /**< No errors */ +#define C66XX_PARAM_ERR -1 /**< Invalid function parameter */ +#define C66XX_INVALID_HW_ERR -2 /**< Invalid H/W error (invalid board, etc.) */ +#define C66XX_HW_ERR -3 /**< H/W error (error writing to the DSP control registers, etc) */ +#define C66XX_I2C_ERR -10 /**< I2C module is not correctly operated */ +#define C66XX_I2C_AL_ERR -11 /**< I2C module arbitration lost error */ +#define C66XX_I2C_RSFULL_ERR -12 /**< I2C module overrun error */ +#define C66XX_I2C_XSMT_ERR -13 /**< I2C module underflow error */ +#define C66XX_I2C_NACK_ERR -14 /**< I2C module no-acknowledgement error */ +#define C66XX_I2C_ARDY_ERR -15 /**< I2C module register-access-ready error */ +#define C66XX_I2C_READ_ERR -16 /**< I2C module read error */ +#define C66XX_I2C_WRITE_ERR -17 /**< I2C module write error */ +#define C66XX_I2C_TIMEOUT_ERR -18 /**< I2C bus timeout error */ +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ SDK API functions ID defs ====================================== +//============================================================================= +/** @addtogroup C66XX_FUNCTIONS_ID SDK API functions ID defs + * @{ + */ + +enum +{ + C66XX_GET_ERROR_MESSAGE_FUNCTION_ID = 0, + C66XX_GET_FUNCTION_NAME_FUNCTION_ID, + C66XX_SYS_SET_CORE_RESET_STATE_FUNCTION_ID, + C66XX_SYS_GET_CORE_RESET_STATE_FUNCTION_ID, + C66XX_SYS_GET_CORE_RESET_SOURCE_FUNCTION_ID, + C66XX_SYS_SET_CORE_BOOT_ADDRESS_FUNCTION_ID, + C66XX_SYS_INIT_MAIN_PLL_FUNCTION_ID, + C66XX_SYS_GET_MAIN_PLL_SETTINGS_FUNCTION_ID, + C66XX_SYS_INIT_DDR3_PLL_FUNCTION_ID, + C66XX_SYS_GET_DDR3_PLL_SETTINGS_FUNCTION_ID, + C66XX_SYS_INIT_PASS_PLL_FUNCTION_ID, + C66XX_SYS_GET_PASS_PLL_SETTINGS_FUNCTION_ID, + C66XX_SYS_ENABLE_POWER_DOMAIN_FUNCTION_ID, + C66XX_MEM_INIT_XMC_MPAX_SEGMENT_FUNCTION_ID, + C66XX_MEM_INIT_DDR3_FUNCTION_ID, + C66XX_INT_INIT_CORE_FUNCTION_ID, + C66XX_INT_MAP_CORE_EVENT_HANDLER_FUNCTION_ID, + C66XX_INT_UNMAP_CORE_EVENT_HANDLER_FUNCTION_ID, + C66XX_INT_INIT_CHIP_FUNCTION_ID, + C66XX_GPIO_INIT_FUNCTION_ID, + C66XX_TIMER_INIT_FUNCTION_ID, + C66XX_TIMER_START_FUNCTION_ID, + C66XX_TIMER_STOP_FUNCTION_ID, + C66XX_TIMER_RESET_FUNCTION_ID, + C66XX_TIMER_ENABLE_INTERRUPTS_FUNCTION_ID, + C66XX_TIMER_DISABLE_INTERRUPTS_FUNCTION_ID, + C66XX_UART_INIT_FUNCTION_ID, + C66XX_I2C_INIT_FUNCTION_ID, + C66XX_I2C_WRITE_DATA_FUNCTION_ID, + C66XX_I2C_READ_DATA_FUNCTION_ID, + C66XX_GBE_INIT_SERDES_FUNCTION_ID, + C66XX_GBE_INIT_SGMII_FUNCTION_ID, + C66XX_SRIO_INIT_FUNCTION_ID, + C66XX_SRIO_MAP_TX_QUEUE_FUNCTION_ID, + C66XX_SRIO_ROUTE_DOORBELL_INTERRUPT_FUNCTION_ID, + C66XX_NUMBER_OF_FUNCTIONS +}; +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +extern "C" { +#endif + + +//============================================================================= +//============ General SDK API functions declarations ========================= +//============================================================================= + +/** @addtogroup C66XX_GENERAL_FUNCTIONS General DSP SDK API functions + * @{ + */ + +/*------------ C66XX_get_last_error() function ---------------------------*//** + * @brief Function returns error code of last executed API function + * + * @return Error code of last executed API function + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_last_error(void); + + +/*------------ C66XX_get_error_flag() function ---------------------------*//** + * @brief Function returns status of ERROR_FLAG for API functions + * + * ERROR_FLAG is set by each API function in case error has been detected. + * ERROR_FLAG can be reset by C66XX_clear_error_flag() API function + * + * @param[out] error_code - pointer to a variable to receive the error code in + * case error has been detected. In case pointer is NULL, then + * no error code is returned; + * @param[out] error_function_id - pointer to a variable to receive ID of the + * first API function, which has returned with error. In case + * pointer is NULL, then no function ID is returned; + * + * @return Status of ERROR_FLAG: ON or OFF + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_error_flag(int32_t *error_code, int32_t *error_function_id); + + +/*------------ C66XX_clear_error_flag() function -------------------------*//** + * @brief Function clear ERROR_FLAG for API functions + * + * @return Always OK + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_clear_error_flag(void); + + +/*------------ C66XX_get_error_message() function ------------------------*//** + * @brief Function returns the text interpretation of the error code. + * + * @param[in] error - error code to be interpreted; + * @param[out] error_message - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_error_message(int32_t error, char *error_message); + + +/*------------ C66XX_get_function_name() function ------------------------*//** + * @brief Function returns the text interpretation of API function. + * + * @param[in] function_id - ID of the API function to be interpreted; + * @param[out] function_name - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_get_function_name(int32_t function_id, char *function_name); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ System functions =============================================== +//============================================================================= + +/** @addtogroup C66XX_SYS System functions + * @{ + */ + + +/** DSP core reset source is global reset */ +#define C66XX_DSP_CORE_RESET_SRC_IS_GLOBAL_RESET 1 +/** DSP core reset source is local reset */ +#define C66XX_DSP_CORE_RESET_SRC_IS_LOCAL_RESET 2 + + +/** Main PLL Multiplier bitmask */ +#define C66XX_MAIN_PLL_PLLM_BITMASK 0x1fff +/** Main PLL Divider bitmask */ +#define C66XX_MAIN_PLL_PLLD_BITMASK 0x3f +/** Number of PLL dividers */ +#define C66XX_MAIN_PLL_PLLDIV_COUNT 16 + +/** Main PLL divider data descriptor */ +typedef struct +{ + uint32_t enable; /**< PLL divider enable flag */ + uint32_t ratio; /**< PLL divider value (8-bit) */ +} C66XX_MAIN_PLL_PLLDIV_DD; + +// Main PLL divider data descriptor length in bytes +#define C66XX_MAIN_PLL_PLLDIV_DD_LEN sizeof(C66XX_MAIN_PLL_PLLDIV_DD) + + +/** Main PLL data descriptor (contains parameters which are used to init PLL) */ +typedef struct +{ + uint32_t bypass; /**< PLL mode: bypass or not */ + uint32_t pllm; /**< PLL multiplier value (13-bit) */ + uint32_t plld; /**< PLL divider value (6-bit) */ + uint32_t output_divide; /**< PLL output divider value (4-bit) */ + C66XX_MAIN_PLL_PLLDIV_DD plldiv[C66XX_MAIN_PLL_PLLDIV_COUNT]; /**< PLL dividers */ +} C66XX_MAIN_PLL_DD; + +// Main PLL data descriptor length in bytes +#define C66XX_MAIN_PLL_DD_LEN sizeof(C66XX_MAIN_PLL_DD) + + +/** DDR3 PLL data descriptor (contains parameters which are used to init DDR3 PLL) */ +typedef struct +{ + uint32_t pllm; /**< PLL multiplier value (13-bit) */ + uint32_t plld; /**< PLL divider value (6-bit) */ +} C66XX_DDR3_PLL_DD; + +// DDR3 PLL data descriptor length in bytes +#define C66XX_DDR3_PLL_DD_LEN sizeof(C66XX_DDR3_PLL_DD) + + +/** PASS PLL data descriptor (contains parameters which are used to init PASS PLL) */ +typedef struct +{ + uint32_t pllm; /**< PLL multiplier value (13-bit) */ + uint32_t plld; /**< PLL divider value (6-bit) */ +} C66XX_PASS_PLL_DD; + +// PASS PLL data descriptor length in bytes +#define C66XX_PASS_PLL_DD_LEN sizeof(C66XX_PASS_PLL_DD) + + +/*------------ C66XX_SYS_get_core_number() function ----------------------*//** + * @brief Function returns DSP core number at which the program is running + * + * @return DSP core number + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_SYS_get_core_number(void); + + +/*------------ C66XX_SYS_get_max_core_freq() function --------------------*//** + * @brief Function returns DSP core max speed in MHz + * + * @return DSP core max speed in MHz + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_SYS_get_max_core_freq(void); + + +/*------------ C66XX_SYS_set_core_reset_state() function -----------------*//** + * @brief Function sets or releases DSP core local reset + * + * @param[in] core - DSP core number to set or release from local reset + * @param[in] state - DSP core local reset state: ON or OFF + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_set_core_reset_state(uint32_t core, uint32_t state); + + +/*------------ C66XX_SYS_get_core_reset_state() function -----------------*//** + * @brief Function returns DSP core local reset state + * + * @param[in] core - DSP core number to return local reset state + * @param[out] state - pointer to a variable to receive DSP core local reset + * state: ON or OFF + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_core_reset_state(uint32_t core, uint32_t *state); + + +/*------------ C66XX_SYS_get_core_reset_source() function ----------------*//** + * @brief Function returns DSP core reset source: global or local + * + * @param[in] core - DSP core number to return reset source + * @param[out] state - pointer to a variable to receive DSP core reset source: + * global or local + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_core_reset_source(uint32_t core, uint32_t *source); + + +/*------------ C66XX_SYS_set_core_boot_address() function ----------------*//** + * @brief Function sets DSP core boot address. After releasing DSP core from + * reset it will start execution from this memory address. + * Note that DSP core boot address should be 1024 bytes aligned + * + * @param[in] core - DSP core number to set boot address + * @param[in] addr - DSP core boot address: should be 1024 bytes aligned + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_set_core_boot_address(uint32_t core, uint32_t addr); + + +/*------------ C66XX_SYS_init_main_pll() function ------------------------*//** + * @brief Function inits DSP Main PLL according to supplied parameters + * + * @param[in] pll_dd - Main PLL data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_init_main_pll(C66XX_MAIN_PLL_DD *pll_dd); + + +/*------------ C66XX_SYS_get_main_pll_settings() function ----------------*//** + * @brief Function returns DSP Main PLL settings + * + * @param[out] pll_dd - Pointer to a main PLL data descriptor to receive data + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_main_pll_settings(C66XX_MAIN_PLL_DD *pll_dd); + + +/*------------ C66XX_SYS_init_ddr3_pll() function ------------------------*//** + * @brief Function inits DSP DDR3 PLL according to supplied parameters + * + * @param[in] ddr3_pll_dd - DDR3 PLL data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_init_ddr3_pll(C66XX_DDR3_PLL_DD *ddr3_pll_dd); + + +/*------------ C66XX_SYS_get_ddr3_pll_settings() function ----------------*//** + * @brief Function returns DSP DDR3 PLL settings + * + * @param[out] ddr3_pll_dd - Pointer to DDR3 PLL data descriptor to receive +* data + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_ddr3_pll_settings(C66XX_DDR3_PLL_DD *ddr3_pll_dd); + + +/*------------ C66XX_SYS_init_pass_pll() function ------------------------*//** + * @brief Function inits DSP PASS PLL according to supplied parameters + * + * @param[in] pass_pll_dd - PASS PLL data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_init_pass_pll(C66XX_PASS_PLL_DD *pass_pll_dd); + + +/*------------ C66XX_SYS_get_pass_pll_settings() function ----------------*//** + * @brief Function returns DSP PASS PLL settings + * + * @param[out] pass_pll_dd - Pointer to PASS PLL data descriptor to receive +* data + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_get_pass_pll_settings(C66XX_PASS_PLL_DD *pass_pll_dd); + + +/*------------ C66XX_SYS_enable_power_domain() function ------------------*//** + * @brief Function powers up selected power domain + * + * @param[in] domain - power domain number to enable + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SYS_enable_power_domain(uint32_t domain); + + +/** @}*/ +//============================================================================= + + +//============================================================================= +//============ DSP memory controller functions ================================ +//============================================================================= + +/** @addtogroup C66XX_MEM DSP memory controller functions + * @{ + */ + + +/** DSP L1 (P or D) cache sizes */ +#define C66XX_CACHE_L1_0KB CACHE_L1_0KCACHE +#define C66XX_CACHE_L1_4KB CACHE_L1_4KCACHE +#define C66XX_CACHE_L1_8KB CACHE_L1_8KCACHE +#define C66XX_CACHE_L1_16KB CACHE_L1_16KCACHE +#define C66XX_CACHE_L1_32KB CACHE_L1_32KCACHE +#define C66XX_CACHE_L1_MAX_SIZE CACHE_L1_MAXIM3 + + +/** DSP L2 cache sizes */ +#define C66XX_CACHE_L2_0KB CACHE_0KCACHE +#define C66XX_CACHE_L2_32KB CACHE_32KCACHE +#define C66XX_CACHE_L2_64KB CACHE_64KCACHE +#define C66XX_CACHE_L2_128KB CACHE_128KCACHE +#define C66XX_CACHE_L2_256KB CACHE_256KCACHE +#define C66XX_CACHE_L2_512KB CACHE_512KCACHE +#define C66XX_CACHE_L2_MAX_SIZE C66XX_CACHE_L2_512KB + + +/** DDR3 controller initialization data descriptor (contains parameters which are used to init DDR3 controller) */ +typedef struct +{ + EMIF4F_TIMING1_CONFIG timing1_config; /**< DDR3 controller Timing 1 configuration */ + EMIF4F_TIMING2_CONFIG timing2_config; /**< DDR3 controller Timing 2 configuration */ + EMIF4F_TIMING3_CONFIG timing3_config; /**< DDR3 controller Timing 3 configuration */ + EMIF4F_SDRAM_CONFIG sdram_config; /**< DDR3 controller SDRAM configuration */ +} C66XX_DDR3_EMIF_DD; + +// DDR3 controller initialization data descriptor length in bytes +#define C66XX_DDR3_EMIF_DD_LEN sizeof(C66XX_DDR3_EMIF_DD) + + +/** DDR3 controller physical interface (PHY) data descriptor (contains parameters which are used to perform leveling) */ +// All these values should be obtained from DDR3 PHY Calc spreadsheet (sprabl2) provided by TI +typedef struct +{ + uint32_t data0_wrlvl_init_ratio; /**< DDR3 byte lane 7 write leveling initialization ratio */ + uint32_t data1_wrlvl_init_ratio; /**< DDR3 byte lane 6 write leveling initialization ratio */ + uint32_t data2_wrlvl_init_ratio; /**< DDR3 byte lane 5 write leveling initialization ratio */ + uint32_t data3_wrlvl_init_ratio; /**< DDR3 byte lane 4 write leveling initialization ratio */ + uint32_t data4_wrlvl_init_ratio; /**< DDR3 byte lane 3 write leveling initialization ratio */ + uint32_t data5_wrlvl_init_ratio; /**< DDR3 byte lane 2 write leveling initialization ratio */ + uint32_t data6_wrlvl_init_ratio; /**< DDR3 byte lane 1 write leveling initialization ratio */ + uint32_t data7_wrlvl_init_ratio; /**< DDR3 byte lane 0 write leveling initialization ratio */ + uint32_t data8_wrlvl_init_ratio; /**< DDR3 ECC byte lane write leveling initialization ratio */ + uint32_t data0_gatelvl_init_ratio; /**< DDR3 byte lane 7 gate leveling initialization ratio */ + uint32_t data1_gatelvl_init_ratio; /**< DDR3 byte lane 6 gate leveling initialization ratio */ + uint32_t data2_gatelvl_init_ratio; /**< DDR3 byte lane 5 gate leveling initialization ratio */ + uint32_t data3_gatelvl_init_ratio; /**< DDR3 byte lane 4 gate leveling initialization ratio */ + uint32_t data4_gatelvl_init_ratio; /**< DDR3 byte lane 3 gate leveling initialization ratio */ + uint32_t data5_gatelvl_init_ratio; /**< DDR3 byte lane 2 gate leveling initialization ratio */ + uint32_t data6_gatelvl_init_ratio; /**< DDR3 byte lane 1 gate leveling initialization ratio */ + uint32_t data7_gatelvl_init_ratio; /**< DDR3 byte lane 0 gate leveling initialization ratio */ + uint32_t data8_gatelvl_init_ratio; /**< DDR3 ECC byte lane gate leveling initialization ratio */ + uint32_t ddr3_config_reg_12_bitmask; /**< DDR3 configuration 12 register bitmask for INVERT_CLK_OUT field */ +} C66XX_DDR3_PHY_DD; + +// DDR3 controller initialization data descriptor length in bytes +#define C66XX_DDR3_PHY_DD_LEN sizeof(C66XX_DDR3_PHY_DD) + + +/*------------ C66XX_MEM_set_L1P_cache_size() function -------------------*//** + * @brief Function sets DSP L1P cache to the new size + * + * @param[in] new_size - new size of DSP L1P cache + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_MEM_set_L1P_cache_size(uint32_t new_size); + + +/*------------ C66XX_MEM_get_L1P_cache_size() function -------------------*//** + * @brief Function returns DSP L1P cache size + * + * @return DSP L1P cache size + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_L1P_cache_size() CACHE_getL1PSize() + + +/*------------ C66XX_MEM_set_L1D_cache_size() function -------------------*//** + * @brief Function sets DSP L1D cache to the new size + * + * @param[in] new_size - new size of DSP L1D cache + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_MEM_set_L1D_cache_size(uint32_t new_size); + + +/*------------ C66XX_MEM_get_L1D_cache_size() function -------------------*//** + * @brief Function returns DSP L1D cache size + * + * @return DSP L1D cache size + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_L1D_cache_size() CACHE_getL1DSize() + + +/*------------ C66XX_MEM_set_L2_cache_size() function --------------------*//** + * @brief Function sets DSP L2 cache to the new size + * + * @param[in] new_size - new size of DSP L2 cache + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_MEM_set_L2_cache_size(uint32_t new_size); + + +/*------------ C66XX_MEM_get_L2_cache_size() function --------------------*//** + * @brief Function returns DSP L2 cache size + * + * @return DSP L2 cache size + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_L2_cache_size() CACHE_getL2Size() + + +/*------------ C66XX_MEM_set_memory_region_cache_config() function -------*//** + * @brief Function enables or disables DSP caching for specified memory region + * + * @param[in] mar - MAR register number from 0 to 255 (note that the first 12 + * memory regions are read-only) + * @param[in] cacheable - cache mode to set: ON - enable caching, + * OFF - disable caching + * @param[in] prefetchable - DSP XMC controller prefetch mode to set: + * ON - enable prefetch support, OFF - disable prefetch support + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_set_memory_region_cache_config(mar, cacheable, prefetchable) CACHE_setMemRegionInfo(mar, cacheable, prefetchable) + + +/*------------ C66XX_MEM_get_memory_region_cache_config() function -------*//** + * @brief Function returns DSP cache configuration for specified memory region + * + * @param[in] mar - MAR register number from 0 to 255 (note that the first 12 + * memory regions are read-only) + * @param[in] cacheable - pointer to a variable to receive current cache mode: + * ON - caching is enabled, OFF - caching is disabled + * @param[in] prefetchable - pointer to a variable to receive current DSP XMC + * controller prefetch mode: ON - prefetch support is enabled, + * OFF - prefetch support is disabled + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define C66XX_MEM_get_memory_region_cache_config(mar, cacheable, prefetchable) CACHE_getMemRegionInfo(mar, cacheable, prefetchable) + + +/*------------ C66XX_MEM_init_xmc_mpax_segment() function ----------------*//** + * @brief Function configures XMC MPAX segment according to supplied + * parameters + * + * @param[in] index - MPAX segment index from 0 to 15 (note that the first 2 + * segments are already configured by default) + * @param[in] baddr - upper 20 bit of base 32-bit address to remap + * @param[in] size - encoded segment size + * @param[in] raddr - upper 24 bit of replacement 36-bit address + * @param[in] perm - access types allowed in this segment + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_MEM_init_xmc_mpax_segment(uint32_t index, uint32_t baddr, uint32_t size, uint32_t raddr, uint32_t perm); + + +/*------------ C66XX_MEM_convert_local_to_global_address() function ------*//** + * @brief Function converts local DSP core address to global address + * + * @param[in] addr - local DSP core address to be converted + * + * @return Global address + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_MEM_convert_local_to_global_address(uint32_t addr); + + +/*------------ C66XX_MEM_init_ddr3() function --------------------------------*//** + * @brief Function inits DDR3 controller according to supplied parameters + * + * @param[in] ddr3_emif_dd - DDR3 controller initialization data descriptor + * @param[in] ddr3_phy_dd - DDR3 PHY controller initialization data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_MEM_init_ddr3(C66XX_DDR3_EMIF_DD *ddr3_emif_dd, C66XX_DDR3_PHY_DD *ddr3_phy_dd); + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Timer TSC functions ============================================ +//============================================================================= + +/** @addtogroup C66XX_TSC DSP 64-bit Time Stamp Counter (TSC) functions + * @{ + */ + +/*------------ C66XX_TSC_get_current_value() function --------------------*//** + * @brief Function returns DSP TSC current value + * + * @return 64-bit Time Stamp Counter value + * +-----------------------------------------------------------------------------*/ +uint64_t C66XX_TSC_get_current_value(void); + + +/*------------ C66XX_TSC_get_duration_s() function -----------------------*//** + * @brief Function returns time duration in seconds from Time Stamp Counter + * start value + * + * @param[in] start - 64-bit Time Stamp Counter value + * + * @return Time duration in seconds + * +-----------------------------------------------------------------------------*/ +double C66XX_TSC_get_duration_s(uint64_t start); + + +/*------------ C66XX_TSC_set_delay_us() function -------------------------*//** + * @brief Function is used to delay the execution for selected number of + * microseconds + * + * @param[in] us - Number of microseconds to delay + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_TSC_set_delay_us(uint32_t us); + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ C66xx interrupt controller functions =========================== +//============================================================================= + +/** @addtogroup C66XX_INT C66xx interrupt controller functions + * @{ + */ + + +/** DSP interrupt vector IDs */ +#define C66XX_DSP_VECTID_NMI CSL_INTC_VECTID_NMI +#define C66XX_DSP_VECTID_4 CSL_INTC_VECTID_4 +#define C66XX_DSP_VECTID_5 CSL_INTC_VECTID_5 +#define C66XX_DSP_VECTID_6 CSL_INTC_VECTID_6 +#define C66XX_DSP_VECTID_7 CSL_INTC_VECTID_7 +#define C66XX_DSP_VECTID_8 CSL_INTC_VECTID_8 +#define C66XX_DSP_VECTID_9 CSL_INTC_VECTID_9 +#define C66XX_DSP_VECTID_10 CSL_INTC_VECTID_10 +#define C66XX_DSP_VECTID_11 CSL_INTC_VECTID_11 +#define C66XX_DSP_VECTID_12 CSL_INTC_VECTID_12 +#define C66XX_DSP_VECTID_13 CSL_INTC_VECTID_13 +#define C66XX_DSP_VECTID_14 CSL_INTC_VECTID_14 +#define C66XX_DSP_VECTID_15 CSL_INTC_VECTID_15 +#define C66XX_DSP_VECTID_COMBINE CSL_INTC_VECTID_COMBINE +#define C66XX_DSP_VECTID_EXCEP CSL_INTC_VECTID_EXCEP + + +/*------------ C66XX_INT_init_core() function ----------------------------*//** + * @brief Function initializes C66x CorePac interrupt controller (INTC) using + * CSL library. + * + * If SYS/BIOS RTOS is used, then it's recommended to use the relevant + * SYS/BIOS interrupt API (HWI, EventCombiner and CpIntc), as there will be + * conflicts since both CSL and SYS/BIOS will use their own Interrupt Service + * Table Pointer (ISTP). + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_init_core(void); + + +/*------------ C66XX_INT_map_core_event_handler() function ---------------*//** + * @brief Function maps DSP interrupt vector to INTC input event ID, plugs + * the specified function as DSP interrupt handler function, and enables DSP + * interrupt + * + * @param[in] dsp_vector_id - DSP interrupt vector + * @param[in] input_event_id - INTC input event ID + * @param[in] handler - pointer to DSP interrupt handler function + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_map_core_event_handler(uint32_t dsp_vector_id, uint32_t input_event_id, CSL_IntcEventHandler handler); + + +/*------------ C66XX_INT_unmap_core_event_handler() function -------------*//** + * @brief Function unmaps DSP interrupt vector and disables the corresponding + * DSP interrupt. + * + * @param[in] dsp_vector_id - DSP interrupt vector + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_unmap_core_event_handler(uint32_t dsp_vector_id); + + +/*------------ C66XX_INT_set_core_dsp_interrupt_handler() function -------*//** + * @brief Function sets the specified function as a direct handler for DSP + * interrupt vector ID. + * + * This handler function will be branched to from DSP interrupt vector table + * for specified DSP interrupt vector ID, so either it should be declared in C + * with "interrupt" keyword or manually save and restore interrupt context and + * return with "B IRP" assembler instruction. + * The specified DSP interrupt will be enabled too. + * + * @param[in] dsp_vector_id - DSP interrupt vector + * @param[in] isr_handler - direct handler function for DSP interrupt vector + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_set_core_dsp_interrupt_handler(uint32_t dsp_vector_id, void *isr_handler); + + +/** Chip interrupt controllers defs */ +#define C66XX_CPINTC_ID_0 0 +#define C66XX_CPINTC_ID_1 1 +#define C66XX_CPINTC_ID_2 2 +#define C66XX_CPINTC_ID_3 3 + + +/*------------ C66XX_INT_init_chip() function ----------------------------*//** + * @brief Function initializes the specified chip interrupt controller + * (CPINTC or CIC) and returns a handle which should be used in all subsequent + * CPINTC function calls. + * + * @param[in] cpintc_id - chip interrupt controller number to initialize (0-3) + * + * @return Handle to the CPINTC instance: >0 - OK, + * 0 - error is occurred + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_INT_init_chip(uint32_t cpintc_id); + + +/*------------ C66XX_INT_map_chip_system_to_host_event() function --------*//** + * @brief Function maps chip-level event (system event) to CPINTC output event + * (host event) end enables it. + * + * System events are those events generated by a hardware module in the system. + * These events are inputs into CPINTC. + * Host events are the output events of CPINTC, which act as event inputs to + * C66x CorePac interrupt controllers (INTC). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] system_event_id - chip-level (system) event from a hardware + * module in the system. + * @param[in] host_event_id - CPINTC output event ID + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_INT_map_chip_system_to_host_event(uint32_t cpintc_handle, uint32_t system_event_id, uint32_t host_event_id); + + +/*------------ C66XX_INT_enable_chip_host_event() function ---------------*//** + * @brief Function enables CPINTC output event (host event). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] host_event_id - CPINTC output event ID to enable + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +#define C66XX_INT_enable_chip_host_event(cpintc_handle, host_event_id) CSL_CPINTC_enableHostInterrupt(cpintc_handle, host_event_id) + + +/*------------ C66XX_INT_disable_chip_host_event() function --------------*//** + * @brief Function disables CPINTC output event (host event). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] host_event_id - CPINTC output event ID to disable + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +#define C66XX_INT_disable_chip_host_event(cpintc_handle, host_event_id) CSL_CPINTC_disableHostInterrupt(cpintc_handle, host_event_id) + + +/*------------ C66XX_INT_clear_chip_system_event() function --------------*//** + * @brief Function clears CPINTC input event (system event). + * + * @param[in] cpintc_handle - chip interrupt controller handle returned by + * C66XX_init_cpintc() function call; + * @param[in] sys_event_id - CPINTC input event ID to clear + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +#define C66XX_INT_clear_chip_system_event(cpintc_handle, sys_event_id) CSL_CPINTC_clearSysInterrupt(cpintc_handle, sys_event_id) + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ General purpose I/O (GPIO) functions =========================== +//============================================================================= + +/** @addtogroup C66XX_GPIO DSP GPIO functions + * @{ + */ + +/** GPIO pins number defs */ +enum C66XX_GPIO_PINS +{ + C66XX_GPIO_PIN_0 = 0, + C66XX_GPIO_PIN_1, + C66XX_GPIO_PIN_2, + C66XX_GPIO_PIN_3, + C66XX_GPIO_PIN_4, + C66XX_GPIO_PIN_5, + C66XX_GPIO_PIN_6, + C66XX_GPIO_PIN_7, + C66XX_GPIO_PIN_8, + C66XX_GPIO_PIN_9, + C66XX_GPIO_PIN_10, + C66XX_GPIO_PIN_11, + C66XX_GPIO_PIN_12, + C66XX_GPIO_PIN_13, + C66XX_GPIO_PIN_14, + C66XX_GPIO_PIN_15 +}; + +/** GPIO pins bitmask defs */ +enum C66XX_GPIO_PIN_BITMASKS +{ + C66XX_GPIO_PIN_0_BITMASK = 0x0001, + C66XX_GPIO_PIN_1_BITMASK = 0x0002, + C66XX_GPIO_PIN_2_BITMASK = 0x0004, + C66XX_GPIO_PIN_3_BITMASK = 0x0008, + C66XX_GPIO_PIN_4_BITMASK = 0x0010, + C66XX_GPIO_PIN_5_BITMASK = 0x0020, + C66XX_GPIO_PIN_6_BITMASK = 0x0040, + C66XX_GPIO_PIN_7_BITMASK = 0x0080, + C66XX_GPIO_PIN_8_BITMASK = 0x0100, + C66XX_GPIO_PIN_9_BITMASK = 0x0200, + C66XX_GPIO_PIN_10_BITMASK = 0x0400, + C66XX_GPIO_PIN_11_BITMASK = 0x0800, + C66XX_GPIO_PIN_12_BITMASK = 0x1000, + C66XX_GPIO_PIN_13_BITMASK = 0x2000, + C66XX_GPIO_PIN_14_BITMASK = 0x4000, + C66XX_GPIO_PIN_15_BITMASK = 0x8000 +}; + + +/** GPIO bank number for CSL utilities */ +#define C66XX_GPIO_BANK_NUMBER 0 +/** GPIO data definitions */ +#define C66XX_GPIO_DATA_OFF 0 +#define C66XX_GPIO_DATA_ON 1 +/** GPIO direction definitions */ +#define C66XX_GPIO_DIR_OUT 0 +#define C66XX_GPIO_DIR_IN 1 +/** GPIO pin edge defs */ +#define C66XX_GPIO_PIN_EDGE_RISING 0 +#define C66XX_GPIO_PIN_EDGE_FALLING 1 +#define C66XX_GPIO_PIN_EDGE_ANY 2 +/** GPIO pins bitmask definitions */ +#define C66XX_GPIO_DATA_BITMASK 0x0000ffff + + +/*------------ C66XX_GPIO_init() function --------------------------------*//** + * @brief Function inits the GPIO peripheral: all pins are configured as + * inputs, interrupts are disabled + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_GPIO_init(void); + + +/*------------ C66XX_GPIO_set_pin_direction() function -------------------*//** + * @brief Function configures the specified GPIO pin direction + * + * @param[in] pin_number - GPIO pin number to configure + * @param[in] direction - GPIO direction definition + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_pin_direction(uint32_t pin_number, uint32_t direction); + + +/*------------ C66XX_GPIO_get_pin_direction() function -------------------*//** + * @brief Function returns the specified GPIO pin direction + * + * @param[in] pin_number - GPIO pin number to get direction + * + * @return GPIO direction definition + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_pin_direction(uint32_t pin_number); + + +/*------------ C66XX_GPIO_set_pin_data() function ------------------------*//** + * @brief Function sets the specified GPIO pin state to data + * + * @param[in] pin_number - GPIO pin number to configure + * @param[in] data - GPIO pin state: ON or OFF + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_pin_data(uint32_t pin_number, uint32_t data); + + +/*------------ C66XX_GPIO_get_pin_data() function ------------------------*//** + * @brief Function returns the specified GPIO pin state + * + * @param[in] pin_number - GPIO pin number to get pin state + * + * @return GPIO pin state: ON or OFF + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_pin_data(uint32_t pin_number); + + +/*------------ C66XX_GPIO_set_direction() function -----------------------*//** + * @brief Function configures the specified GPIO pins direction + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to configure + * @param[in] direction - GPIO direction definition + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_direction(uint32_t pin_bitmask, uint32_t direction); + + +/*------------ C66XX_GPIO_get_direction() function -----------------------*//** + * @brief Function returns the specified GPIO pins direction + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to get pins direction + * + * @return Specified GPIO pins direction + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_direction(uint32_t pin_bitmask); + + +/*------------ C66XX_GPIO_set_data() function ----------------------------*//** + * @brief Function sets the specified GPIO pins state to data + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to configure + * @param[in] data - GPIO pins state: ON or OFF + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_set_data(uint32_t pin_bitmask, uint32_t data); + + +/*------------ C66XX_GPIO_get_data() function ----------------------------*//** + * @brief Function returns the specified GPIO pins state + * + * @param[in] pin_bitmask - GPIO pins (ORed) bitmask to get pins state + * + * @return Specified GPIO pins state + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_GPIO_get_data(uint32_t pin_bitmask); + + +/*------------ C66XX_GPIO_enable_interrupts() function -------------------*//** + * @brief Function enables GPIO peripheral interrupts + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_enable_interrupts(void); + + +/*------------ C66XX_GPIO_disable_interrupts() function ------------------*//** + * @brief Function disables GPIO peripheral interrupts + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_disable_interrupts(void); + + +/*------------ C66XX_GPIO_enable_edge_interrupt() function ---------------*//** + * @brief Function enables the specified GPIO pin edge interrupt + * + * @param[in] pin - GPIO pin number to configure + * @param[in] edge - GPIO pin edge which triggers GPIO interrupt + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_enable_edge_interrupt(uint32_t pin, uint32_t edge); + + +/*------------ C66XX_GPIO_disable_edge_interrupt() function --------------*//** + * @brief Function disables the specified GPIO pin edge interrupt + * + * @param[in] pin - GPIO pin number to configure + * @param[in] edge - GPIO pin edge which shouldn't trigger GPIO interrupt + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_GPIO_disable_edge_interrupt(uint32_t pin, uint32_t edge); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Timer module functions ========================================= +//============================================================================= + +/** @addtogroup C66XX_TIMER DSP 64-bit Timer module functions + * @{ + */ + + +/** DSP 64-bit Timer module number defs */ +typedef enum +{ + C66XX_TIMER_0 = 0, + C66XX_TIMER_1, + C66XX_TIMER_2, + C66XX_TIMER_3, + C66XX_TIMER_4, + C66XX_TIMER_5, + C66XX_TIMER_6, + C66XX_TIMER_7, + C66XX_TIMER_8, + C66XX_TIMER_9, + C66XX_TIMER_10, + C66XX_TIMER_11, + C66XX_TIMER_12, + C66XX_TIMER_13, + C66XX_TIMER_14, + C66XX_TIMER_15 +} C66XX_TIMER; + + +/** DSP 64-bit Timer mode defs */ +typedef enum +{ + C66XX_TIMER_MODE_64BIT_GPT = 0, + C66XX_TIMER_MODE_32BIT_UNCHAINED, + C66XX_TIMER_MODE_64BIT_WDT, + C66XX_TIMER_MODE_32BIT_CHAINED +} C66XX_TIMER_MODE; + + +/** DSP 64-bit Timer hardware configuration defs */ +typedef enum +{ + C66XX_TIMER_HW_CFG_64BIT = 0, + C66XX_TIMER_HW_CFG_32BIT_LOW, + C66XX_TIMER_HW_CFG_32BIT_HIGH +} C66XX_TIMER_HW_CFG; + + +/** DSP 64-bit Timer count mode defs */ +typedef enum +{ + C66XX_TIMER_COUNT_MODE_DISABLED = 0, + C66XX_TIMER_COUNT_MODE_ONE_SHOT, + C66XX_TIMER_COUNT_MODE_CONTINUOUSLY, + C66XX_TIMER_COUNT_MODE_CONTINUOUSLY_RELOAD +} C66XX_TIMER_COUNT_MODE; + + +/** DSP timer input enable defs */ +typedef enum +{ + C66XX_TIMER_CLK_INPUT_DISABLED = 0, + C66XX_TIMER_CLK_INPUT_ENABLED +} C66XX_TIMER_CLK_INPUT; + + +/** DSP timer input inverter control defs */ +typedef enum +{ + C66XX_TIMER_CLK_INPUT_INVERTER_DISABLED = 0, + C66XX_TIMER_CLK_INPUT_INVERTER_ENABLED +} C66XX_TIMER_CLK_INPUT_INVERTER; + + +/** DSP timer clock source defs */ +typedef enum +{ + C66XX_TIMER_CLK_SRC_INTERNAL = 0, + C66XX_TIMER_CLK_SRC_EXTERNAL +} C66XX_TIMER_CLK_SRC; + + +/** DSP timer clock/pulse mode for timer output defs */ +typedef enum +{ + C66XX_TIMER_CLK_OUTPUT_MODE_PULSE = 0, + C66XX_TIMER_CLK_OUTPUT_MODE_CLK +} C66XX_TIMER_CLK_OUTPUT_MODE; + + +/** DSP timer pulse width used in pulse mode for timer output defs */ +typedef enum +{ + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_1CLK = 0, + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_2CLK, + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_3CLK, + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH_4CLK +} C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH; + + +/** DSP timer output inverter control defs */ +typedef enum +{ + C66XX_TIMER_CLK_OUTPUT_INVERTER_DISABLED = 0, + C66XX_TIMER_CLK_OUTPUT_INVERTER_ENABLED +} C66XX_TIMER_CLK_OUTPUT_INVERTER; + + +/** DSP 32-bit Timer configuration data descriptor */ +typedef struct +{ + C66XX_TIMER_CLK_SRC clk_src; /**< Clock source for 32-bit timer */ + C66XX_TIMER_CLK_INPUT clk_input_enabled; /**< Timer clock is gated by the timer input for 32-bit timer */ + C66XX_TIMER_CLK_INPUT_INVERTER clk_input_inverter_enabled; /**< An inverted timer input drives the 32-bit timer */ + C66XX_TIMER_CLK_OUTPUT_MODE clk_src_output_mode; /**< Clock output mode for 32-bit timer */ + C66XX_TIMER_CLK_OUTPUT_PULSE_WIDTH clk_src_output_pulse_width; /**< Clock output pulse width used in pulse mode for 32-bit timer */ + C66XX_TIMER_CLK_OUTPUT_INVERTER clk_output_inverter_enabled; /**< 32-bit timer output is inverted */ +} C66XX_TIMER_32BIT_CFG_DD; + + +/** DSP 64-bit Timer module configuration data descriptor */ +typedef struct +{ + C66XX_TIMER_MODE timer_mode; /**< Timer mode: 64-bit GPT, 64-bit WDT, dual 32-bit unchained or chained */ + C66XX_TIMER_32BIT_CFG_DD timer_high; /**< Configuration data descriptor for 32-bit HIGH timer */ + C66XX_TIMER_32BIT_CFG_DD timer_low; /**< Configuration data descriptor for 32-bit LOW timer */ +} C66XX_TIMER_CFG_DD; + +// DSP 64-bit Timer module configuration data descriptor length in bytes +#define C66XX_TIMER_CFG_DD_LEN sizeof(C66XX_TIMER_CFG_DD) + + +/*------------ C66XX_TIMER_init() function -------------------------------*//** + * @brief Function configures selected DSP 64-bit timer module + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] frequency - DSP timer output frequency in Hz + * @param[in] cfg_dd - pointer to filled DSP 64-bit timer module configuration + * data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_init(C66XX_TIMER timer_number, uint32_t frequency, C66XX_TIMER_CFG_DD *cfg_dd); + + +/*------------ C66XX_TIMER_start() function ------------------------------*//** + * @brief Function starts selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_start - hardware timer to start (64BIT/32BIT_LOW/ + * 32BIT_HIGH) + * @param[in] count_mode - DSP timer counting mode (DISABLED/ONE_SHOT/ + * CONTINUOUSLY/CONTINUOUSLY_RELOAD) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_start(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_start, C66XX_TIMER_COUNT_MODE count_mode); + + +/*------------ C66XX_TIMER_stop() function -------------------------------*//** + * @brief Function stops selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_stop - hardware timer to stop (64BIT/32BIT_LOW/ + * 32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_stop(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_stop); + + +/*------------ C66XX_TIMER_reset() function ------------------------------*//** + * @brief Function resets selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_reset - hardware timer to reset (64BIT/32BIT_LOW/ + * 32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_reset(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_reset); + + +/*------------ C66XX_TIMER_enable_interrupts() function ------------------*//** + * @brief Function enables interrupts from selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_enable - hardware timer to enable interrupts from + * (64BIT/32BIT_LOW/32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_enable_interrupts(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_enable); + + +/*------------ C66XX_TIMER_disable_interrupts() function ------------------*//** + * @brief Function disables interrupts from selected DSP timer + * + * @param[in] timer_number - DSP 64-bit timer module number + * @param[in] timer_to_disable - hardware timer to disable interrupts from + * (64BIT/32BIT_LOW/32BIT_HIGH) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_TIMER_disable_interrupts(C66XX_TIMER timer_number, C66XX_TIMER_HW_CFG timer_to_disable); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ UART functions ================================================= +//============================================================================= + +/** @addtogroup C66XX_UART DSP UART functions + * @{ + */ + +// UART baud rate defs (max 128 kBauds) +#define C66XX_UART_BAUD_RATE_2400 2400 /**< UART baud rate 2400 bps */ +#define C66XX_UART_BAUD_RATE_4800 4800 /**< UART baud rate 4800 bps */ +#define C66XX_UART_BAUD_RATE_9600 9600 /**< UART baud rate 9600 bps */ +#define C66XX_UART_BAUD_RATE_19200 19200 /**< UART baud rate 19200 bps */ +#define C66XX_UART_BAUD_RATE_38400 38400 /**< UART baud rate 38400 bps */ +#define C66XX_UART_BAUD_RATE_57600 57600 /**< UART baud rate 57600 bps */ +#define C66XX_UART_BAUD_RATE_115200 115200 /**< UART baud rate 115200 bps */ + +// UART data bits defs +#define C66XX_UART_DATA_BITS_5BITS 5 /**< UART 5-bits data words */ +#define C66XX_UART_DATA_BITS_6BITS 6 /**< UART 6-bits data words */ +#define C66XX_UART_DATA_BITS_7BITS 7 /**< UART 7-bits data words */ +#define C66XX_UART_DATA_BITS_8BITS 8 /**< UART 8-bits data words */ + +// UART parity parameter defs +#define C66XX_UART_PARITY_NONE 0 /**< no parity */ +#define C66XX_UART_PARITY_EVEN 1 /**< even parity */ +#define C66XX_UART_PARITY_ODD 2 /**< odd parity */ + +// UART stop bits defs +#define C66XX_UART_STOP_BITS_1BIT 0 /**< one stop bit */ +#define C66XX_UART_STOP_BITS_1_5BITS 1 /**< one and a half stop bits */ +#define C66XX_UART_STOP_BITS_2BITS 2 /**< two stop bits */ + +// UART key defs +#define C66XX_UART_KEY_BEEP 0x7 /**< BELL value in HEX */ +#define C66XX_UART_KEY_ESC 0x1b /**< ESC value in HEX */ +#define C66XX_UART_KEY_CR 0xd /**< Carriage Return value in HEX */ +#define C66XX_UART_KEY_BS 0x8 /**< Back space value in HEX */ +#define C66XX_UART_LINE_LEN_MAX 80 /**< Maximum available received line length */ + + + +/*------------ C66XX_UART_init() function --------------------------------*//** + * @brief Function inits the UART peripheral + * + * @param[in] core_clk - DSP core clock frequency in MHz; + * @param[in] baud_rate - desired baud rate; + * @param[in] data_bits - number of data bits; + * @param[in] parity - parity bit; + * @param[in] stop_bits - number of stop bits; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_UART_init(uint32_t core_clk, uint32_t baud_rate, uint32_t data_bits, uint32_t parity, uint32_t stop_bits); + + +/*------------ C66XX_UART_receiver_is_ready() function -------------------*//** + * @brief Function checks if a character is received over UART + * + * @return 1 - a character is received over UART, + * 0 - otherwise + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_UART_receiver_is_ready(void); + + +/*------------ C66XX_UART_receive_char() function ------------------------*//** + * @brief Function receives a character over UART + * + * @return Received character + * +-----------------------------------------------------------------------------*/ +uint8_t C66XX_UART_receive_char(void); + + +/*------------ C66XX_UART_transmit_char() function -----------------------*//** + * @brief Function transmits a character over UART + * + * @param[in] c - A character to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_UART_transmit_char(uint8_t c); + + +/*------------ C66XX_UART_transmit_string() function ---------------------*//** + * @brief Function transmits a string until '0' character + * + * @param[in] s - A pointer to the string to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +void C66XX_UART_transmit_string(char *s); + + +/*------------ C66XX_UART_receive_line_string() function -----------------*//** + * @brief Function receives a line ended with CR character, and stores + * received characters into string with '\0' symbol. + * + * Note that maximum received line length should not exceed + * C66XX_UART_LINE_LEN_MAX value! + * + * @param[in] s - Pointer to a string to store received characters + * + * @return Number of received characters without '\0' symbol. + * +-----------------------------------------------------------------------------*/ +uint32_t C66XX_UART_receive_line_string(char *s); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ I2C functions ================================================== +//============================================================================= + +/** @addtogroup C66XX_I2C DSP I2C functions + * @{ + */ + + +// I2C interrupt codes +#define C66XX_I2C_INTCODE_NONE 0 /**< No interrupt */ +#define C66XX_I2C_INTCODE_AL 1 /**< Arbitration-lost interrupt */ +#define C66XX_I2C_INTCODE_NACK 2 /**< No-acknowledge interrupt */ +#define C66XX_I2C_INTCODE_ARDY 3 /**< Register-access-ready interrupt */ +#define C66XX_I2C_INTCODE_ICRRDY 4 /**< Receive-data-ready interrupt */ +#define C66XX_I2C_INTCODE_ICXRDY 5 /**< Transmit-data-ready interrupt */ +#define C66XX_I2C_INTCODE_SCD 6 /**< Stop-condition-detected interrupt */ +#define C66XX_I2C_INTCODE_AAS 7 /**< Address-as-slave interrupt */ + + +/*------------ C66XX_I2C_init() function ---------------------------------*//** + * @brief Function inits the I2C peripheral + * + * @param[in] core_clk - DSP core clock frequency in MHz; + * @param[in] i2c_clk - I2C clock in Hz; + * @param[in] own_addr - I2C own slave address; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_I2C_init(uint32_t core_clk, uint32_t i2c_clk, uint32_t own_addr); + + +/*------------ C66XX_I2C_write_data() function ---------------------------*//** + * @brief Function writes data[len] to I2C chip_addr at mem_addr memory + * address + * + * @param[in] chip_addr - I2C chip address; + * @param[in] mem_addr - memory (register) address within the chip; + * @param[in] mem_addr_len - number of bytes to use for mem_addr (typically 1, + * 2 for larger memories, 0 for register type devices with only + * one register); + * @param[in] data - pointer to data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_I2C_write_data(uint8_t chip_addr, uint32_t mem_addr, uint32_t mem_addr_len, uint8_t *data, uint32_t len); + + +/*------------ C66XX_I2C_read_data() function ----------------------------*//** + * @brief Function reads data[len] from I2C chip_addr at mem_addr memory + * + * @param[in] chip_addr - I2C chip address; + * @param[in] mem_addr - memory (register) address within the chip; + * @param[in] mem_addr_len - number of bytes to use for mem_addr (typically 1, + * 2 for larger memories, 0 for register type devices with only + * one register); + * @param[out] buf - pointer to data buffer to store data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_I2C_read_data(uint8_t chip_addr, uint32_t mem_addr, uint32_t mem_addr_len, uint8_t *buf, uint32_t len); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Gigabit Ethernet (GbE) Switch functions ======================== +//============================================================================= + +/** @addtogroup C66XX_GBE DSP Gigabit Ethernet Switch functions + * @{ + */ + +/*------------ C66XX_GBE_get_mac_id() function ---------------------------*//** + * @brief Function returns DSP MAC address for this device + * + * @return 64-bit variable that contains 48-bit MAC ID + * +-----------------------------------------------------------------------------*/ +uint64_t C66XX_GBE_get_mac_id(void); + + +/*------------ C66XX_GBE_init_serdes() function --------------------------*//** + * @brief Function inits Gigabit Ethernet Serdes block to the default state + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_GBE_init_serdes(void); + + +/** SGMII port Slave operation mode */ +#define C66XX_SGMII_PORT_SLAVE_MODE 0 +/** SGMII port Master operation mode */ +#define C66XX_SGMII_PORT_MASTER_MODE 1 + + +/** SGMII port autonegotiation disabled */ +#define C66XX_SGMII_PORT_AUTONEGOTIATION_DISABLED 0 +/** SGMII port autonegotiation enabled */ +#define C66XX_SGMII_PORT_AUTONEGOTIATION_ENABLED 1 + + +/*------------ C66XX_GBE_init_sgmii() function ---------------------------*//** + * @brief Function inits Gigabit Ethernet SGMII block + * + * Note that this function requires the presence of link partner connected + * at specified SGMII port - PHY or another SGMII. + * + * @param[in] port - MAC port number for which the SGMII port setup should + * be performed + * @param[in] mode - SGMII port operation mode: master or slave. + * @param[in] autoneg - flag to enable autonegotiation on this SGMII port. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_GBE_init_sgmii(uint32_t port, uint32_t mode, uint32_t autoneg); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ SRIO functions ================================================= +//============================================================================= + +/** @addtogroup C66XX_SRIO DSP SRIO functions + * @{ + */ + +/** SRIO vendor identifier */ +#define C66XX_SRIO_DEVICE_VENDOR_ID 0x30 +/** SRIO device revision */ +#define C66XX_SRIO_DEVICE_REVISION 0x0 +/** SRIO assembly identifier */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_ID 0x0 +/** SRIO assembly vendor identifier */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_VENDOR_ID C66XX_SRIO_DEVICE_VENDOR_ID +/** SRIO assembly device revision */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_REVISION C66XX_SRIO_DEVICE_REVISION +/** SRIO assembly extension features */ +#define C66XX_SRIO_DEVICE_ASSEMBLY_FEATURES 0x0100 + + +/** SRIO link rate 1.25 Gbps */ +#define C66XX_SRIO_LINK_RATE_1_25GB 1 +/** SRIO link rate 2.5 Gbps */ +#define C66XX_SRIO_LINK_RATE_2_5GB 2 +/** SRIO link rate 3.125 Gbps */ +#define C66XX_SRIO_LINK_RATE_3_125GB 3 +/** SRIO link rate 5 Gbps */ +#define C66XX_SRIO_LINK_RATE_5GB 4 + + +// SRIO port widths defs - corresponds to SRIO path modes +/** SRIO port width with 1 receive and transmit lane */ +#define C66XX_SRIO_PORT_WIDTH_1X 0 +/** SRIO port width with 2 receive and transmit lanes */ +#define C66XX_SRIO_PORT_WIDTH_2X 3 +/** SRIO port width with 4 receive and transmit lanes */ +#define C66XX_SRIO_PORT_WIDTH_4X 4 + + +/** SRIO port 0 */ +#define C66XX_SRIO_PORT_0 0 +/** SRIO port 1 */ +#define C66XX_SRIO_PORT_1 1 +/** SRIO port 2 */ +#define C66XX_SRIO_PORT_2 2 +/** SRIO port 3 */ +#define C66XX_SRIO_PORT_3 3 + + +/** SRIO peripheral normal operation mode */ +#define C66XX_SRIO_OPMODE_NORMAL 0 +/** SRIO peripheral loopback operation mode - used to test the peripheral */ +#define C66XX_SRIO_OPMODE_LOOPBACK 1 + + +/** SRIO device identificator data descriptor */ +typedef struct +{ + uint32_t dev_id_8bit; /**< SRIO 8-bit device identificator */ + uint32_t dev_id_16bit; /**< SRIO 16-bit device identificator */ +} C66XX_SRIO_DEVICE_ID_DD; + +// SRIO device identificator data descriptor length in bytes +#define C66XX_SRIO_DEVICE_ID_DD_LEN sizeof(C66XX_SRIO_DEVICE_ID_DD) + + +/** SRIO destination device identificators number */ +#define C66XX_SRIO_DESTINATION_DEVICE_ID_COUNT 4 + + +/** SRIO messages (Type9 and Type11) transmit queues mapping data descriptor */ +typedef struct +{ + uint32_t port; /**< SRIO port to which the queue is mapped */ + uint32_t priority; /**< priority bit */ +} C66XX_SRIO_TX_QUEUE_SCH_DD; + +// SRIO messages (Type9 and Type11) transmit queues mapping data descriptor length in bytes +#define C66XX_SRIO_TX_QUEUE_SCH_DD_LEN sizeof(C66XX_SRIO_TX_QUEUE_SCH_DD) + + +/** SRIO peripheral initialization data descriptor */ +typedef struct +{ + uint32_t mode; /**< SRIO peripheral operation mode */ + uint32_t link_rate; /**< SRIO link rate definition */ + uint32_t port_width; /**< SRIO port width definition (1x, 2x, or 4x) */ + C66XX_SRIO_DEVICE_ID_DD src_dev_id_dd; /**< SRIO base device identificators */ + C66XX_SRIO_DEVICE_ID_DD dst_dev_id_dd[C66XX_SRIO_DESTINATION_DEVICE_ID_COUNT]; /**< SRIO destination device identificators */ +} C66XX_SRIO_DD; + +// SRIO peripheral initialization data descriptor length in bytes +#define C66XX_SRIO_DD_LEN sizeof(C66XX_SRIO_DD) + + +/*------------ C66XX_SRIO_init() function --------------------------------*//** + * @brief Function inits the SRIO peripheral + * + * The function does the following: + * 1. SRIO peripheral supports directIO, doorbell, data messaging (Type9 + * packets) and data streaming (Type11 packets) operations. + * 2. Max MTU length is set to 256 bytes. + * 3. SRIO 8-bit and 16-bit base device IDs are set to supplied parameters. + * 4. Available destination SRIO 8-bit and 16-bit device IDs are set + * according to supplied parameters. + * 5. Operation mode is set according to supplied parameter. + * 6. Link rate and ports configuration (4 ports are available) are set + * according to supplied parameters. + * 7. SRIO transmit queues used in data message (Type9 and Type11) operations + * are configured by default: all 16 queues send packets onto Port 0 and + * operate at the same minimum priority level. In case the different mapping + * is needed then C66XX_srio_map_tx_queue() function should be called. + * 8. 64 SRIO doorbell interrupts are configured by default: the first 16 + * interrupts (0-15) are routed to INTDST16 (Interrupt destination 16), + * 16-31 - to INTDST17 (Interrupt destination 17), 32-47 - to INTDST18 + * (Interrupt destination 18), 48-63 - to INTDST19 (Interrupt destination + * 19). In case the different interrupt routing is needed then + * C66XX_srio_route_doorbell_interrupt() function should be called. + * 9. GARBAGE queues, which can used by the TXU, are not configured. + * + * @param[in] srio_dd - SRIO peripheral initialization data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SRIO_init(C66XX_SRIO_DD *srio_dd); + + +/*------------ C66XX_SRIO_map_tx_queue() function ------------------------*//** + * @brief Function configures the selected SRIO transmit queue according to + * supplied parameters: SRIO port to which the queue is mapped and priority + * bit + * + * @param[in] queue - transmit queue number (0 - 15) + * @param[in] tx_queue_sch_dd - transmit queue mapping data descriptor + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SRIO_map_tx_queue(uint32_t queue, C66XX_SRIO_TX_QUEUE_SCH_DD *tx_queue_sch_dd); + + +/*------------ C66XX_SRIO_route_doorbell_interrupt() function ------------*//** + * @brief Function configures the selected SRIO doorbell interrupt to + * specified interrupt destination number + * + * @param[in] doorbell - SRIO doorbell interrupt number (0 - 63) + * @param[in] intdst - interrupt destination number (0 - 23) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t C66XX_SRIO_route_doorbell_interrupt(uint32_t doorbell, uint32_t intdst); + + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __C66XX_FUNCTIONS_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx b/ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx new file mode 100644 index 00000000..54e7ef57 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/C66XX_MACROS.hxx @@ -0,0 +1,1154 @@ +/****************************************************************************** + TMS320C66xx KeyStone Multicore DSP Software Development Kit (SDK). Rev 2A. + (C) MicroLAB Systems, 2014-2015 + + File: Macros + ----- + + Notes: + ------ + 1. This C-header file contains C66xx DSP macro definitions and + is used with C66XX.h C-header file. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file C66XX_MACROS.hxx + * + * @brief Macros + * + * This file contains C66xx DSP macro definitions + * + */ + + +#ifndef __C66XX_MACROS_HXX__ // check for this file has been already included +#define __C66XX_MACROS_HXX__ 1 + + +//============================================================================= +//------------ I/O peripherals data type selector for C66xx DSP --------------- +// C66xx DSP has all I/O peripherals aligned as LSB of 32-bit words, then +// I/O peripherals should be accessed as UNSIGNED only. + +// The declared __C66XX_IO_DATA_TYPE__ is used to unify below macros and +// functions and to make particular selection at the run-time compilation time. +//================================================================ + +typedef volatile uint32_t __C66XX_IO_DATA_TYPE__; + +// read-back data bitmask for DSP memory-mapped registers (32-bit wide) +#define C66XX_RG_DATA_BITMASK 0xffffffff +//============================================================================= + + + +//============================================================================= +//============ General register access macros ================================= +//============================================================================= +// Macro to get selected register value +#define C66XX_GET_RG_VALUE(addr) ((*(__C66XX_IO_DATA_TYPE__ *) addr) & C66XX_RG_DATA_BITMASK) + +// Macro to set selected register to value +#define C66XX_SET_RG_VALUE(addr, val) ((*(__C66XX_IO_DATA_TYPE__ *) addr) = (val & C66XX_RG_DATA_BITMASK)) + +// Macro to make FIELD for the supplied value +#define C66XX_MAKE_FIELD(FIELD, val) (((val) << C66XX_##FIELD##_BITSHIFT) & C66XX_##FIELD##_BITMASK) + +// Macro to get FIELD value from the selected register +#define C66XX_GET_FIELD_VALUE(addr, FIELD) (((*(__C66XX_IO_DATA_TYPE__ *) addr) & C66XX_##FIELD##_BITMASK) >> C66XX_##FIELD##_BITSHIFT) + +// Macro to set FIELD to value in the selected register +#define C66XX_SET_FIELD_VALUE(addr, FIELD, val) ((*(__C66XX_IO_DATA_TYPE__ *) addr) = ((*(__C66XX_IO_DATA_TYPE__ *) addr) & ~C66XX_##FIELD##_BITMASK) | C66XX_MAKE_FIELD(FIELD, val)) + +//============================================================================= + + + +//============================================================================= +//============ DSP core registers macros ====================================== +//============================================================================= + +//------------ DSP CorePack revision register macros -------------------------- +#define C66XX_get_core_mm_revid_rg() C66XX_GET_RG_VALUE(C66XX_CORE_MM_REVID_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_core_mm_revid_version() C66XX_GET_FIELD_VALUE(C66XX_CORE_MM_REVID_RG_ADDR, CORE_MM_REVID_VERSION) +#define C66XX_get_core_mm_revid_revision() C66XX_GET_FIELD_VALUE(C66XX_CORE_MM_REVID_RG_ADDR, CORE_MM_REVID_REVISION) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_CORE_MM_REVID_VERSION_IS_C6678 (C66XX_get_core_mm_revid_version() == C66XX_CORE_MM_REVID_VERSION_C6678) +#define C66XX_CORE_MM_REVID_REVISION_IS_1_0 (C66XX_get_core_mm_revid_revision() == C66XX_CORE_MM_REVID_REVISION_1_0) +#define C66XX_CORE_MM_REVID_REVISION_IS_2_0 (C66XX_get_core_mm_revid_revision() == C66XX_CORE_MM_REVID_REVISION_2_0) + +//------------ DSP interrupt controller registers macros ---------------------- +// i index corresonds to DSP Event registers number +// Note that i index should be from 0 to 3 !!! +#define C66XX_get_core_evtflag_rg_addr(i) (C66XX_CORE_EVTFLAG_RG_BADDR + i * C66XX_CORE_EVTFLAG_RG_OFFSET) +#define C66XX_get_core_evtflag_rg(i) C66XX_GET_RG_VALUE(C66XX_get_core_evtflag_rg_addr(i)) + +#define C66XX_get_core_evtset_rg_addr(i) (C66XX_CORE_EVTSET_RG_BADDR + i * C66XX_CORE_EVTSET_RG_OFFSET) +#define C66XX_set_core_evtset_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_core_evtset_rg_addr(i), v) + +#define C66XX_get_core_evtclr_rg_addr(i) (C66XX_CORE_EVTCLR_RG_BADDR + i * C66XX_CORE_EVTCLR_RG_OFFSET) +#define C66XX_set_core_evtclr_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_core_evtclr_rg_addr(i), v) + +#define C66XX_get_core_evtmask_rg_addr(i) (C66XX_CORE_EVTMASK_RG_BADDR + i * C66XX_CORE_EVTMASK_RG_OFFSET) +#define C66XX_get_core_evtmask_rg(i) C66XX_GET_RG_VALUE(C66XX_get_core_evtmask_rg_addr(i)) +#define C66XX_set_core_evtmask_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_core_evtmask_rg_addr(i), v) + +//------------ DSP interrupt macros ------------------------------------------- +// These macros are used to set/get particular DSP Event in DSP Event registers +// i index corresonds to DSP Event ID number (0 - 127) +#define C66XX_get_core_event_id_rg(i) (i / 32) +#define C66XX_get_core_event_id_bitmask(i) (0x1 << (i % 32)) + +#define C66XX_get_core_event_id_flag(i) (C66XX_get_core_evtflag_rg(C66XX_get_core_event_id_rg(i)) & C66XX_get_core_event_id_bitmask(i)) +#define C66XX_set_core_event_id_flag(i) (C66XX_set_core_evtset_rg(C66XX_get_core_event_id_rg(i), C66XX_get_core_event_id_bitmask(i))) +#define C66XX_clear_core_event_id_flag(i) (C66XX_set_core_evtclr_rg(C66XX_get_core_event_id_rg(i), C66XX_get_core_event_id_bitmask(i))) +#define C66XX_get_core_event_id_mask(i) (C66XX_get_core_evtmask_rg(C66XX_get_core_event_id_rg(i)) & C66XX_get_core_event_id_bitmask(i)) +#define C66XX_set_core_event_id_mask(i) (C66XX_set_core_evtmask_rg(C66XX_get_core_event_id_rg(i), C66XX_get_core_event_id_bitmask(i))) + +//============================================================================= + + + +//============================================================================= +//============ PLL controller registers macros ================================ +//============================================================================= + +//------------ PLL control register macros ------------------------------------ +#define C66XX_get_pll_pllctl_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLCTL_RG_ADDR) +#define C66XX_set_pll_pllctl_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllctl_pllensrc() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLENSRC) +#define C66XX_set_pll_pllctl_pllensrc(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLENSRC, v) +#define C66XX_get_pll_pllctl_pllrst() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLRST) +#define C66XX_set_pll_pllctl_pllrst(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLRST, v) +#define C66XX_get_pll_pllctl_pllpwrdn() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLPWRDN) +#define C66XX_set_pll_pllctl_pllpwrdn(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLPWRDN, v) +#define C66XX_get_pll_pllctl_pllen() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLEN) +#define C66XX_set_pll_pllctl_pllen(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCTL_RG_ADDR, PLL_PLLCTL_PLLEN, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLCTL_PLLENSRC_ON C66XX_set_pll_pllctl_pllensrc(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLENSRC_OFF C66XX_set_pll_pllctl_pllensrc(C66XX_OFF) +#define C66XX_SET_PLL_PLLCTL_PLLRST_ON C66XX_set_pll_pllctl_pllrst(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLRST_OFF C66XX_set_pll_pllctl_pllrst(C66XX_OFF) +#define C66XX_SET_PLL_PLLCTL_PLLPWRDN_ON C66XX_set_pll_pllctl_pllpwrdn(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLPWRDN_OFF C66XX_set_pll_pllctl_pllpwrdn(C66XX_OFF) +#define C66XX_SET_PLL_PLLCTL_PLLEN_ON C66XX_set_pll_pllctl_pllen(C66XX_ON) +#define C66XX_SET_PLL_PLLCTL_PLLEN_OFF C66XX_set_pll_pllctl_pllen(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLCTL_PLLENSRC_IS_ON (C66XX_get_pll_pllctl_pllensrc() == C66XX_ON) +#define C66XX_PLL_PLLCTL_PLLRST_IS_ON (C66XX_get_pll_pllctl_pllrst() == C66XX_ON) +#define C66XX_PLL_PLLCTL_PLLPWRDN_IS_ON (C66XX_get_pll_pllctl_pllpwrdn() == C66XX_ON) +#define C66XX_PLL_PLLCTL_PLLEN_IS_ON (C66XX_get_pll_pllctl_pllen() == C66XX_ON) + + +//------------ PLL secondary control register macros -------------------------- +#define C66XX_get_pll_secctl_rg() C66XX_GET_RG_VALUE(C66XX_PLL_SECCTL_RG_ADDR) +#define C66XX_set_pll_secctl_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_SECCTL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_secctl_bypass() C66XX_GET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_BYPASS) +#define C66XX_set_pll_secctl_bypass(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_BYPASS, v) +#define C66XX_get_pll_secctl_output_divide() C66XX_GET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_OUTPUT_DIVIDE) +#define C66XX_set_pll_secctl_output_divide(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_SECCTL_RG_ADDR, PLL_SECCTL_OUTPUT_DIVIDE, v) + + // direct bit set macros +#define C66XX_SET_PLL_SECCTL_BYPASS_ON C66XX_set_pll_secctl_bypass(C66XX_ON) +#define C66XX_SET_PLL_SECCTL_BYPASS_OFF C66XX_set_pll_secctl_bypass(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_SECCTL_BYPASS_IS_ON (C66XX_get_pll_secctl_bypass() == C66XX_ON) + + +//------------ PLL multiplier control register macros ------------------------- +#define C66XX_get_pll_pllm_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLM_RG_ADDR) +#define C66XX_set_pll_pllm_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLM_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllm_pllm() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLM_RG_ADDR, PLL_PLLM_PLLM) +#define C66XX_set_pll_pllm_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLM_RG_ADDR, PLL_PLLM_PLLM, v) + + +//------------ PLL controller divider registers macros ------------------------ +// i index corresonds to PLL controller divider registers number +// Note that i index should be from 0 to 15 instead of 1 to 16 !!! +#define C66XX_get_pll_plldiv_rg_addr(i) (i < 3 ? (C66XX_PLL_PLLDIV1_RG_ADDR + i * 0x4) : (C66XX_PLL_PLLDIV4_RG_ADDR + (i - 3) * 0x4)) +#define C66XX_get_pll_plldiv_rg(i) C66XX_GET_RG_VALUE(C66XX_get_pll_plldiv_rg_addr(i)) +#define C66XX_set_pll_plldiv_rg(i, v) C66XX_SET_RG_VALUE(C66XX_get_pll_plldiv_rg_addr(i), v) + + // dedicated bit specific macros +#define C66XX_get_pll_plldiv_den(i) C66XX_GET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_DEN) +#define C66XX_set_pll_plldiv_den(i, v) C66XX_SET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_DEN, v) +#define C66XX_get_pll_plldiv_ratio(i) C66XX_GET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_RATIO) +#define C66XX_set_pll_plldiv_ratio(i, v) C66XX_SET_FIELD_VALUE(C66XX_get_pll_plldiv_rg_addr(i), PLL_PLLDIV_RATIO, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLDIV_DEN_ON(i) C66XX_set_pll_plldiv_den(i, C66XX_ON) +#define C66XX_SET_PLL_PLLDIV_DEN_OFF(i) C66XX_set_pll_plldiv_den(i, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLDIV_DEN_IS_ON(i) (C66XX_get_pll_plldiv_den(i) == C66XX_ON) + + +//------------ PLL controller command register macros ------------------------- +#define C66XX_get_pll_pllcmd_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLCMD_RG_ADDR) +#define C66XX_set_pll_pllcmd_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLCMD_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllcmd_goset() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLCMD_RG_ADDR, PLL_PLLCMD_GOSET) +#define C66XX_set_pll_pllcmd_goset(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLCMD_RG_ADDR, PLL_PLLCMD_GOSET, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLCMD_GOSET_ON C66XX_set_pll_pllcmd_goset(C66XX_ON) +#define C66XX_SET_PLL_PLLCMD_GOSET_OFF C66XX_set_pll_pllcmd_goset(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLCMD_GOSET_IS_ON (C66XX_get_pll_pllcmd_goset() == C66XX_ON) + + +//------------ PLL controller status register macros -------------------------- +#define C66XX_get_pll_pllstat_rg() C66XX_GET_RG_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR) +#define C66XX_set_pll_pllstat_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_pllstat_gostat() C66XX_GET_FIELD_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR, PLL_PLLSTAT_GOSTAT) +#define C66XX_set_pll_pllstat_gostat(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_PLLSTAT_RG_ADDR, PLL_PLLSTAT_GOSTAT, v) + + // direct bit set macros +#define C66XX_SET_PLL_PLLSTAT_GOSTAT_ON C66XX_set_pll_pllstat_gostat(C66XX_ON) +#define C66XX_SET_PLL_PLLSTAT_GOSTAT_OFF C66XX_set_pll_pllstat_gostat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_PLL_PLLSTAT_GOSTAT_IS_ON (C66XX_get_pll_pllstat_gostat() == C66XX_ON) + + +//------------ PLL controller clock align control register macros ------------- +#define C66XX_get_pll_alnctl_rg() C66XX_GET_RG_VALUE(C66XX_PLL_ALNCTL_RG_ADDR) +#define C66XX_set_pll_alnctl_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_ALNCTL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_alnctl_aln() C66XX_GET_FIELD_VALUE(C66XX_PLL_ALNCTL_RG_ADDR, PLL_ALNCTL_ALN) +#define C66XX_set_pll_alnctl_aln(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_ALNCTL_RG_ADDR, PLL_ALNCTL_ALN, v) + + +//------------ PLL controller divider ratio change status register macros ----- +#define C66XX_get_pll_dchange_rg() C66XX_GET_RG_VALUE(C66XX_PLL_DCHANGE_RG_ADDR) +#define C66XX_set_pll_dchange_rg(v) C66XX_SET_RG_VALUE(C66XX_PLL_DCHANGE_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_pll_dchange_sys() C66XX_GET_FIELD_VALUE(C66XX_PLL_DCHANGE_RG_ADDR, PLL_DCHANGE_SYS) +#define C66XX_set_pll_dchange_sys(v) C66XX_SET_FIELD_VALUE(C66XX_PLL_DCHANGE_RG_ADDR, PLL_DCHANGE_SYS, v) + + +//------------ SYSCLK status register macros ---------------------------------- +#define C66XX_get_pll_systat_rg() C66XX_GET_RG_VALUE(C66XX_PLL_SYSTAT_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_pll_systat_syson() C66XX_GET_FIELD_VALUE(C66XX_PLL_SYSTAT_RG_ADDR, PLL_SYSTAT_SYSON) + +//============================================================================= + + + +//============================================================================= +//============ Device State Control registers macros ========================== +//============================================================================= + +//------------ Main PLL Control register 0 macros ----------------------------- +#define C66XX_get_bootcfg_mainpllctl0_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR) +#define C66XX_set_bootcfg_mainpllctl0_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_mainpllctl0_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_BWADJ) +#define C66XX_set_bootcfg_mainpllctl0_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_BWADJ, v) +#define C66XX_get_bootcfg_mainpllctl0_pllm() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLM) +#define C66XX_set_bootcfg_mainpllctl0_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLM, v) +#define C66XX_get_bootcfg_mainpllctl0_plld() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLD) +#define C66XX_set_bootcfg_mainpllctl0_plld(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL0_RG_ADDR, BOOTCFG_MAINPLLCTL0_PLLD, v) + + +//------------ Main PLL Control register 1 macros ----------------------------- +#define C66XX_get_bootcfg_mainpllctl1_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR) +#define C66XX_set_bootcfg_mainpllctl1_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_mainpllctl1_ensat() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_ENSAT) +#define C66XX_set_bootcfg_mainpllctl1_ensat(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_ENSAT, v) +#define C66XX_get_bootcfg_mainpllctl1_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_BWADJ) +#define C66XX_set_bootcfg_mainpllctl1_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_MAINPLLCTL1_RG_ADDR, BOOTCFG_MAINPLLCTL1_BWADJ, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_MAINPLLCTL1_ENSAT_ON C66XX_set_bootcfg_mainpllctl1_ensat(C66XX_ON) +#define C66XX_SET_BOOTCFG_MAINPLLCTL1_ENSAT_OFF C66XX_set_bootcfg_mainpllctl1_ensat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_MAINPLLCTL1_ENSAT_IS_ON (C66XX_get_bootcfg_mainpllctl1_ensat() == C66XX_ON) + + +//------------ DDR3 PLL Control register 0 macros ----------------------------- +#define C66XX_get_bootcfg_ddr3pllctl0_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR) +#define C66XX_set_bootcfg_ddr3pllctl0_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_ddr3pllctl0_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BWADJ) +#define C66XX_set_bootcfg_ddr3pllctl0_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BWADJ, v) +#define C66XX_get_bootcfg_ddr3pllctl0_bypass() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BYPASS) +#define C66XX_set_bootcfg_ddr3pllctl0_bypass(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_BYPASS, v) +#define C66XX_get_bootcfg_ddr3pllctl0_pllm() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLM) +#define C66XX_set_bootcfg_ddr3pllctl0_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLM, v) +#define C66XX_get_bootcfg_ddr3pllctl0_plld() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLD) +#define C66XX_set_bootcfg_ddr3pllctl0_plld(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL0_RG_ADDR, BOOTCFG_DDR3PLLCTL0_PLLD, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_DDR3PLLCTL0_BYPASS_ON C66XX_set_bootcfg_ddr3pllctl0_bypass(C66XX_ON) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL0_BYPASS_OFF C66XX_set_bootcfg_ddr3pllctl0_bypass(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_DDR3PLLCTL0_BYPASS_IS_ON (C66XX_get_bootcfg_ddr3pllctl0_bypass() == C66XX_ON) + + +//------------ DDR3 PLL Control register 1 macros ----------------------------- +#define C66XX_get_bootcfg_ddr3pllctl1_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR) +#define C66XX_set_bootcfg_ddr3pllctl1_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_ddr3pllctl1_pllrst() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_PLLRST) +#define C66XX_set_bootcfg_ddr3pllctl1_pllrst(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_PLLRST, v) +#define C66XX_get_bootcfg_ddr3pllctl1_ensat() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_ENSAT) +#define C66XX_set_bootcfg_ddr3pllctl1_ensat(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_ENSAT, v) +#define C66XX_get_bootcfg_ddr3pllctl1_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_BWADJ) +#define C66XX_set_bootcfg_ddr3pllctl1_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_DDR3PLLCTL1_RG_ADDR, BOOTCFG_DDR3PLLCTL1_BWADJ, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_PLLRST_ON C66XX_set_bootcfg_ddr3pllctl1_pllrst(C66XX_ON) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_PLLRST_OFF C66XX_set_bootcfg_ddr3pllctl1_pllrst(C66XX_OFF) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_ENSAT_ON C66XX_set_bootcfg_ddr3pllctl1_ensat(C66XX_ON) +#define C66XX_SET_BOOTCFG_DDR3PLLCTL1_ENSAT_OFF C66XX_set_bootcfg_ddr3pllctl1_ensat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_DDR3PLLCTL1_PLLRST_IS_ON (C66XX_get_bootcfg_ddr3pllctl1_pllrst() == C66XX_ON) +#define C66XX_BOOTCFG_DDR3PLLCTL1_ENSAT_IS_ON (C66XX_get_bootcfg_ddr3pllctl1_ensat() == C66XX_ON) + + +//------------ PASS PLL Control register 0 macros ----------------------------- +#define C66XX_get_bootcfg_passpllctl0_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR) +#define C66XX_set_bootcfg_passpllctl0_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_passpllctl0_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BWADJ) +#define C66XX_set_bootcfg_passpllctl0_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BWADJ, v) +#define C66XX_get_bootcfg_passpllctl0_bypass() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BYPASS) +#define C66XX_set_bootcfg_passpllctl0_bypass(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_BYPASS, v) +#define C66XX_get_bootcfg_passpllctl0_pllm() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLM) +#define C66XX_set_bootcfg_passpllctl0_pllm(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLM, v) +#define C66XX_get_bootcfg_passpllctl0_plld() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLD) +#define C66XX_set_bootcfg_passpllctl0_plld(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL0_RG_ADDR, BOOTCFG_PASSPLLCTL0_PLLD, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_PASSPLLCTL0_BYPASS_ON C66XX_set_bootcfg_passpllctl0_bypass(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL0_BYPASS_OFF C66XX_set_bootcfg_passpllctl0_bypass(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_PASSPLLCTL0_BYPASS_IS_ON (C66XX_get_bootcfg_passpllctl0_bypass() == C66XX_ON) + + +//------------ PASS PLL Control register 1 macros ----------------------------- +#define C66XX_get_bootcfg_passpllctl1_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR) +#define C66XX_set_bootcfg_passpllctl1_rg(v) C66XX_SET_RG_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_bootcfg_passpllctl1_pllrst() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLRST) +#define C66XX_set_bootcfg_passpllctl1_pllrst(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLRST, v) +#define C66XX_get_bootcfg_passpllctl1_pllselect() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLSELECT) +#define C66XX_set_bootcfg_passpllctl1_pllselect(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_PLLSELECT, v) +#define C66XX_get_bootcfg_passpllctl1_ensat() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_ENSAT) +#define C66XX_set_bootcfg_passpllctl1_ensat(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_ENSAT, v) +#define C66XX_get_bootcfg_passpllctl1_bwadj() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_BWADJ) +#define C66XX_set_bootcfg_passpllctl1_bwadj(v) C66XX_SET_FIELD_VALUE(C66XX_BOOTCFG_PASSPLLCTL1_RG_ADDR, BOOTCFG_PASSPLLCTL1_BWADJ, v) + + // direct bit set macros +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLRST_ON C66XX_set_bootcfg_passpllctl1_pllrst(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLRST_OFF C66XX_set_bootcfg_passpllctl1_pllrst(C66XX_OFF) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLSELECT_ON C66XX_set_bootcfg_passpllctl1_pllselect(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_PLLSELECT_OFF C66XX_set_bootcfg_passpllctl1_pllselect(C66XX_OFF) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_ENSAT_ON C66XX_set_bootcfg_passpllctl1_ensat(C66XX_ON) +#define C66XX_SET_BOOTCFG_PASSPLLCTL1_ENSAT_OFF C66XX_set_bootcfg_passpllctl1_ensat(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLRST_IS_ON (C66XX_get_bootcfg_passpllctl1_pllrst() == C66XX_ON) +#define C66XX_BOOTCFG_PASSPLLCTL1_PLLSELECT_IS_ON (C66XX_get_bootcfg_passpllctl1_pllselect() == C66XX_ON) +#define C66XX_BOOTCFG_PASSPLLCTL1_ENSAT_IS_ON (C66XX_get_bootcfg_passpllctl1_ensat() == C66XX_ON) + + +//------------ Device speed register macros ----------------------------------- +#define C66XX_get_bootcfg_devspeed_rg() C66XX_GET_RG_VALUE(C66XX_BOOTCFG_DEVSPEED_RG_ADDR) + // dedicated bit specific macros +#define C66XX_get_bootcfg_devspeed_devspeed() C66XX_GET_FIELD_VALUE(C66XX_BOOTCFG_DEVSPEED_RG_ADDR, BOOTCFG_DEVSPEED_DEVSPEED) + +//============================================================================= + + + +//============================================================================= +//============ I2C registers macros =========================================== +//============================================================================= + +//------------ I2C own address register macros -------------------------------- +#define C66XX_get_i2c_icoar_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICOAR_RG_ADDR) +#define C66XX_set_i2c_icoar_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICOAR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icoar_oaddr() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICOAR_RG_ADDR, I2C_ICOAR_OADDR) +#define C66XX_set_i2c_icoar_oaddr(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICOAR_RG_ADDR, I2C_ICOAR_OADDR, v) + + +//------------ I2C interrupt mask register macros ----------------------------- +#define C66XX_get_i2c_icimr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICIMR_RG_ADDR) +#define C66XX_set_i2c_icimr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICIMR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icimr_aas() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AAS) +#define C66XX_set_i2c_icimr_aas(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AAS, v) +#define C66XX_get_i2c_icimr_scd() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_SCD) +#define C66XX_set_i2c_icimr_scd(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_SCD, v) +#define C66XX_get_i2c_icimr_icxrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICXRDY) +#define C66XX_set_i2c_icimr_icxrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICXRDY, v) +#define C66XX_get_i2c_icimr_icrdrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICRDRDY) +#define C66XX_set_i2c_icimr_icrdrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ICRDRDY, v) +#define C66XX_get_i2c_icimr_ardy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ARDY) +#define C66XX_set_i2c_icimr_ardy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_ARDY, v) +#define C66XX_get_i2c_icimr_nack() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_NACK) +#define C66XX_set_i2c_icimr_nack(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_NACK, v) +#define C66XX_get_i2c_icimr_al() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AL) +#define C66XX_set_i2c_icimr_al(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICIMR_RG_ADDR, I2C_ICIMR_AL, v) + + // direct bit set macros +#define C66XX_SET_I2C_ICIMR_AAS_ON C66XX_set_i2c_icimr_aas(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_AAS_OFF C66XX_set_i2c_icimr_aas(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_SCD_ON C66XX_set_i2c_icimr_scd(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_SCD_OFF C66XX_set_i2c_icimr_scd(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_ICXRDY_ON C66XX_set_i2c_icimr_icxrdy(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_ICXRDY_OFF C66XX_set_i2c_icimr_icxrdy(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_ICRDRDY_ON C66XX_set_i2c_icimr_icrdrdy(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_ICRDRDY_OFF C66XX_set_i2c_icimr_icrdrdy(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_ARDY_ON C66XX_set_i2c_icimr_ardy(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_ARDY_OFF C66XX_set_i2c_icimr_ardy(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_NACK_ON C66XX_set_i2c_icimr_nack(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_NACK_OFF C66XX_set_i2c_icimr_nack(C66XX_OFF) +#define C66XX_SET_I2C_ICIMR_AL_ON C66XX_set_i2c_icimr_al(C66XX_ON) +#define C66XX_SET_I2C_ICIMR_AL_OFF C66XX_set_i2c_icimr_al(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICIMR_AAS_IS_ON (C66XX_get_i2c_icimr_aas() == C66XX_ON) +#define C66XX_I2C_ICIMR_SCD_IS_ON (C66XX_get_i2c_icimr_scd() == C66XX_ON) +#define C66XX_I2C_ICIMR_ICXRDY_IS_ON (C66XX_get_i2c_icimr_icxrdy() == C66XX_ON) +#define C66XX_I2C_ICIMR_ICRDRDY_IS_ON (C66XX_get_i2c_icimr_icrdrdy() == C66XX_ON) +#define C66XX_I2C_ICIMR_ARDY_IS_ON (C66XX_get_i2c_icimr_ardy() == C66XX_ON) +#define C66XX_I2C_ICIMR_NACK_IS_ON (C66XX_get_i2c_icimr_nack() == C66XX_ON) +#define C66XX_I2C_ICIMR_AL_IS_ON (C66XX_get_i2c_icimr_al() == C66XX_ON) + + +//------------ I2C interrupt status register macros --------------------------- +#define C66XX_get_i2c_icstr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICSTR_RG_ADDR) +#define C66XX_set_i2c_icstr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICSTR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icstr_sdir() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SDIR) +#define C66XX_set_i2c_icstr_sdir(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SDIR, v) +#define C66XX_get_i2c_icstr_nacksnt() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACKSNT) +#define C66XX_set_i2c_icstr_nacksnt(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACKSNT, v) +#define C66XX_get_i2c_icstr_bb() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_BB) +#define C66XX_set_i2c_icstr_bb(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_BB, v) +#define C66XX_get_i2c_icstr_rsfull() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_RSFULL) +#define C66XX_get_i2c_icstr_xsmt() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_XSMT) +#define C66XX_get_i2c_icstr_aas() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AAS) +#define C66XX_get_i2c_icstr_ad0() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AD0) +#define C66XX_get_i2c_icstr_scd() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SCD) +#define C66XX_set_i2c_icstr_scd(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_SCD, v) +#define C66XX_get_i2c_icstr_icxrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICXRDY) +#define C66XX_set_i2c_icstr_icxrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICXRDY, v) +#define C66XX_get_i2c_icstr_icrdrdy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICRDRDY) +#define C66XX_set_i2c_icstr_icrdrdy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ICRDRDY, v) +#define C66XX_get_i2c_icstr_ardy() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ARDY) +#define C66XX_set_i2c_icstr_ardy(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_ARDY, v) +#define C66XX_get_i2c_icstr_nack() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACK) +#define C66XX_set_i2c_icstr_nack(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_NACK, v) +#define C66XX_get_i2c_icstr_al() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AL) +#define C66XX_set_i2c_icstr_al(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSTR_RG_ADDR, I2C_ICSTR_AL, v) + + // direct bit set macros +#define C66XX_CLEAR_I2C_ICSTR_SDIR C66XX_set_i2c_icstr_sdir(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_NACKSNT C66XX_set_i2c_icstr_nacksnt(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_BB C66XX_set_i2c_icstr_bb(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_SCD C66XX_set_i2c_icstr_scd(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_ICXRDY C66XX_set_i2c_icstr_icxrdy(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_ICRDRDY C66XX_set_i2c_icstr_icrdrdy(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_ARDY C66XX_set_i2c_icstr_ardy(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_NACK C66XX_set_i2c_icstr_nack(C66XX_ON) +#define C66XX_CLEAR_I2C_ICSTR_AL C66XX_set_i2c_icstr_al(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICSTR_SDIR_IS_ON (C66XX_get_i2c_icstr_sdir() == C66XX_ON) +#define C66XX_I2C_ICSTR_NACKSNT_IS_ON (C66XX_get_i2c_icstr_nacksnt() == C66XX_ON) +#define C66XX_I2C_ICSTR_BB_IS_ON (C66XX_get_i2c_icstr_bb() == C66XX_ON) +#define C66XX_I2C_ICSTR_RSFULL_IS_ON (C66XX_get_i2c_icstr_rsfull() == C66XX_ON) +#define C66XX_I2C_ICSTR_XSMT_IS_ON (C66XX_get_i2c_icstr_xsmt() == C66XX_ON) +#define C66XX_I2C_ICSTR_AAS_IS_ON (C66XX_get_i2c_icstr_aas() == C66XX_ON) +#define C66XX_I2C_ICSTR_AD0_IS_ON (C66XX_get_i2c_icstr_ad0() == C66XX_ON) +#define C66XX_I2C_ICSTR_SCD_IS_ON (C66XX_get_i2c_icstr_scd() == C66XX_ON) +#define C66XX_I2C_ICSTR_ICXRDY_IS_ON (C66XX_get_i2c_icstr_icxrdy() == C66XX_ON) +#define C66XX_I2C_ICSTR_ICRDRDY_IS_ON (C66XX_get_i2c_icstr_icrdrdy() == C66XX_ON) +#define C66XX_I2C_ICSTR_ARDY_IS_ON (C66XX_get_i2c_icstr_ardy() == C66XX_ON) +#define C66XX_I2C_ICSTR_NACK_IS_ON (C66XX_get_i2c_icstr_nack() == C66XX_ON) +#define C66XX_I2C_ICSTR_AL_IS_ON (C66XX_get_i2c_icstr_al() == C66XX_ON) + + +//------------ I2C clock low-time divider register macros --------------------- +#define C66XX_get_i2c_icclkl_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICCLKL_RG_ADDR) +#define C66XX_set_i2c_icclkl_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICCLKL_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icclkl_iccl() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICCLKL_RG_ADDR, I2C_ICCLKL_ICCL) +#define C66XX_set_i2c_icclkl_iccl(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICCLKL_RG_ADDR, I2C_ICCLKL_ICCL, v) + + +//------------ I2C clock high-time divider register macros -------------------- +#define C66XX_get_i2c_icclkh_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICCLKH_RG_ADDR) +#define C66XX_set_i2c_icclkh_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICCLKH_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icclkh_icch() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICCLKH_RG_ADDR, I2C_ICCLKH_ICCH) +#define C66XX_set_i2c_icclkh_icch(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICCLKH_RG_ADDR, I2C_ICCLKH_ICCH, v) + + +//------------ I2C data count register macros --------------------------------- +#define C66XX_get_i2c_iccnt_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICCNT_RG_ADDR) +#define C66XX_set_i2c_iccnt_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICCNT_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_iccnt_icdc() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICCNT_RG_ADDR, I2C_ICCNT_ICDC) +#define C66XX_set_i2c_iccnt_icdc(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICCNT_RG_ADDR, I2C_ICCNT_ICDC, v) + + +//------------ I2C data receive register macros ------------------------------- +#define C66XX_get_i2c_icdrr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICDRR_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_i2c_icdrr_d() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICDRR_RG_ADDR, I2C_ICDRR_D) + + +//------------ I2C slave address register macros ------------------------------ +#define C66XX_get_i2c_icsar_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICSAR_RG_ADDR) +#define C66XX_set_i2c_icsar_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICSAR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icsar_saddr() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICSAR_RG_ADDR, I2C_ICSAR_SADDR) +#define C66XX_set_i2c_icsar_saddr(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICSAR_RG_ADDR, I2C_ICSAR_SADDR, v) + + +//------------ I2C data transmit register macros ------------------------------ +#define C66XX_get_i2c_icdxr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICDXR_RG_ADDR) +#define C66XX_set_i2c_icdxr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICDXR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icdxr_d() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICDXR_RG_ADDR, I2C_ICDXR_D) +#define C66XX_set_i2c_icdxr_d(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICDXR_RG_ADDR, I2C_ICDXR_D, v) + + +//------------ I2C mode register macros --------------------------------------- +#define C66XX_get_i2c_icmdr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICMDR_RG_ADDR) +#define C66XX_set_i2c_icmdr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICMDR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icmdr_nackmod() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_NACKMOD) +#define C66XX_set_i2c_icmdr_nackmod(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_NACKMOD, v) +#define C66XX_get_i2c_icmdr_free() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FREE) +#define C66XX_set_i2c_icmdr_free(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FREE, v) +#define C66XX_get_i2c_icmdr_stt() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STT) +#define C66XX_set_i2c_icmdr_stt(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STT, v) +#define C66XX_get_i2c_icmdr_stp() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STP) +#define C66XX_set_i2c_icmdr_stp(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STP, v) +#define C66XX_get_i2c_icmdr_mst() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_MST) +#define C66XX_set_i2c_icmdr_mst(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_MST, v) +#define C66XX_get_i2c_icmdr_trx() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_TRX) +#define C66XX_set_i2c_icmdr_trx(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_TRX, v) +#define C66XX_get_i2c_icmdr_xa() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_XA) +#define C66XX_set_i2c_icmdr_xa(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_XA, v) +#define C66XX_get_i2c_icmdr_rm() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_RM) +#define C66XX_set_i2c_icmdr_rm(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_RM, v) +#define C66XX_get_i2c_icmdr_dlb() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_DLB) +#define C66XX_set_i2c_icmdr_dlb(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_DLB, v) +#define C66XX_get_i2c_icmdr_irs() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_IRS) +#define C66XX_set_i2c_icmdr_irs(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_IRS, v) +#define C66XX_get_i2c_icmdr_stb() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STB) +#define C66XX_set_i2c_icmdr_stb(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_STB, v) +#define C66XX_get_i2c_icmdr_fdf() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FDF) +#define C66XX_set_i2c_icmdr_fdf(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_FDF, v) +#define C66XX_get_i2c_icmdr_bc() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_BC) +#define C66XX_set_i2c_icmdr_bc(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICMDR_RG_ADDR, I2C_ICMDR_BC, v) + + // direct bit set macros +#define C66XX_SET_I2C_ICMDR_NACKMOD_ON C66XX_set_i2c_icmdr_nackmod(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_NACKMOD_OFF C66XX_set_i2c_icmdr_nackmod(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_FREE_ON C66XX_set_i2c_icmdr_free(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_FREE_OFF C66XX_set_i2c_icmdr_free(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_STT_ON C66XX_set_i2c_icmdr_stt(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_STT_OFF C66XX_set_i2c_icmdr_stt(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_STP_ON C66XX_set_i2c_icmdr_stp(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_STP_OFF C66XX_set_i2c_icmdr_stp(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_MST_ON C66XX_set_i2c_icmdr_mst(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_MST_OFF C66XX_set_i2c_icmdr_mst(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_TRX_ON C66XX_set_i2c_icmdr_trx(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_TRX_OFF C66XX_set_i2c_icmdr_trx(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_XA_OFF C66XX_set_i2c_icmdr_xa(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_XA_ON C66XX_set_i2c_icmdr_xa(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_RM_OFF C66XX_set_i2c_icmdr_rm(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_RM_ON C66XX_set_i2c_icmdr_rm(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_DLB_OFF C66XX_set_i2c_icmdr_dlb(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_DLB_ON C66XX_set_i2c_icmdr_dlb(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_IRS_OFF C66XX_set_i2c_icmdr_irs(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_IRS_ON C66XX_set_i2c_icmdr_irs(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_STB_OFF C66XX_set_i2c_icmdr_stb(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_STB_ON C66XX_set_i2c_icmdr_stb(C66XX_ON) +#define C66XX_SET_I2C_ICMDR_FDF_OFF C66XX_set_i2c_icmdr_fdf(C66XX_OFF) +#define C66XX_SET_I2C_ICMDR_FDF_ON C66XX_set_i2c_icmdr_fdf(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICMDR_NACKMOD_IS_ON (C66XX_get_i2c_icmdr_nackmod() == C66XX_ON) +#define C66XX_I2C_ICMDR_FREE_IS_ON (C66XX_get_i2c_icmdr_free() == C66XX_ON) +#define C66XX_I2C_ICMDR_STT_IS_ON (C66XX_get_i2c_icmdr_stt() == C66XX_ON) +#define C66XX_I2C_ICMDR_STP_IS_ON (C66XX_get_i2c_icmdr_stp() == C66XX_ON) +#define C66XX_I2C_ICMDR_MST_IS_ON (C66XX_get_i2c_icmdr_mst() == C66XX_ON) +#define C66XX_I2C_ICMDR_TRX_IS_ON (C66XX_get_i2c_icmdr_trx() == C66XX_ON) +#define C66XX_I2C_ICMDR_XA_IS_ON (C66XX_get_i2c_icmdr_xa() == C66XX_ON) +#define C66XX_I2C_ICMDR_RM_IS_ON (C66XX_get_i2c_icmdr_rm() == C66XX_ON) +#define C66XX_I2C_ICMDR_DLB_IS_ON (C66XX_get_i2c_icmdr_dlb() == C66XX_ON) +#define C66XX_I2C_ICMDR_IRS_IS_ON (C66XX_get_i2c_icmdr_irs() == C66XX_ON) +#define C66XX_I2C_ICMDR_STB_IS_ON (C66XX_get_i2c_icmdr_stb() == C66XX_ON) +#define C66XX_I2C_ICMDR_FDF_IS_ON (C66XX_get_i2c_icmdr_fdf() == C66XX_ON) + + +//------------ I2C interrupt vector register macros --------------------------- +#define C66XX_get_i2c_icivr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICIVR_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_i2c_icivr_intcode() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICIVR_RG_ADDR, I2C_ICIVR_INTCODE) + + +//------------ I2C extended mode register macros ------------------------------ +#define C66XX_get_i2c_icemdr_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICEMDR_RG_ADDR) +#define C66XX_set_i2c_icemdr_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icemdr_ignack() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_IGNACK) +#define C66XX_set_i2c_icemdr_ignack(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_IGNACK, v) +#define C66XX_get_i2c_icemdr_bcm() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_BCM) +#define C66XX_set_i2c_icemdr_bcm(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICEMDR_RG_ADDR, I2C_ICEMDR_BCM, v) + + // direct bit set macros +#define C66XX_SET_I2C_ICEMDR_IGNACK_ON C66XX_set_i2c_icemdr_ignack(C66XX_ON) +#define C66XX_SET_I2C_ICEMDR_IGNACK_OFF C66XX_set_i2c_icemdr_ignack(C66XX_OFF) +#define C66XX_SET_I2C_ICEMDR_BCM_ON C66XX_set_i2c_icemdr_bcm(C66XX_ON) +#define C66XX_SET_I2C_ICEMDR_BCM_OFF C66XX_set_i2c_icemdr_bcm(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_I2C_ICEMDR_IGNACK_IS_ON (C66XX_get_i2c_icemdr_ignack() == C66XX_ON) +#define C66XX_I2C_ICEMDR_BCM_IS_ON (C66XX_get_i2c_icemdr_bcm() == C66XX_ON) + + +//------------ I2C prescaler register macros ---------------------------------- +#define C66XX_get_i2c_icpsc_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICPSC_RG_ADDR) +#define C66XX_set_i2c_icpsc_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICPSC_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icpsc_ipsc() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPSC_RG_ADDR, I2C_ICPSC_IPSC) +#define C66XX_set_i2c_icpsc_ipsc(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPSC_RG_ADDR, I2C_ICPSC_IPSC, v) + + +//------------ I2C peripheral identification 1 register macros ---------------- +#define C66XX_get_i2c_icpid1_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICPID1_RG_ADDR) +#define C66XX_set_i2c_icpid1_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICPID1_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icpid1_class() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_CLASS) +#define C66XX_set_i2c_icpid1_class(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_CLASS, v) +#define C66XX_get_i2c_icpid1_revision() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_REVISION) +#define C66XX_set_i2c_icpid1_revision(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPID1_RG_ADDR, I2C_ICPID1_REVISION, v) + + +//------------ I2C peripheral identification 2 register macros ---------------- +#define C66XX_get_i2c_icpid2_rg() C66XX_GET_RG_VALUE(C66XX_I2C_ICPID2_RG_ADDR) +#define C66XX_set_i2c_icpid2_rg(v) C66XX_SET_RG_VALUE(C66XX_I2C_ICPID2_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_i2c_icpid2_type() C66XX_GET_FIELD_VALUE(C66XX_I2C_ICPID2_RG_ADDR, I2C_ICPID2_TYPE) +#define C66XX_set_i2c_icpid2_type(v) C66XX_SET_FIELD_VALUE(C66XX_I2C_ICPID2_RG_ADDR, I2C_ICPID2_TYPE, v) +//============================================================================= + + + +//============================================================================= +//============ EMIF16 configuration macros ==================================== +//============================================================================= + +//------------ Revision code and status register macros ----------------------- +#define C66XX_get_emif16_rcsr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_RCSR_RG_ADDR) + + // dedicated bit specific macros +#define C66XX_get_emif16_rcsr_be() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_BE) +#define C66XX_get_emif16_rcsr_mod_id() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_MOD_ID) +#define C66XX_get_emif16_rcsr_mj_rev() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_MJ_REV) +#define C66XX_get_emif16_rcsr_min_rev() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_RCSR_RG_ADDR, EMIF16_RCSR_MIN_REV) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_RCSR_BE_IS_ON (C66XX_get_emif16_rcsr_be() == C66XX_ON) +#define C66XX_EMIF16_RCSR_MOD_ID_IS_DEFAULT_VALUE (C66XX_get_emif16_rcsr_mod_id() == C66XX_EMIF16_RCSR_MOD_ID_DEFAULT_VALUE) +#define C66XX_EMIF16_RCSR_MJ_REV_IS_DEFAULT_VALUE (C66XX_get_emif16_rcsr_mj_rev() == C66XX_EMIF16_RCSR_MJ_REV_DEFAULT_VALUE) +#define C66XX_EMIF16_RCSR_MIN_REV_IS_DEFAULT_VALUE (C66XX_get_emif16_rcsr_min_rev() == C66XX_EMIF16_RCSR_MIN_REV_DEFAULT_VALUE) + + +//------------ Async wait cycle config register macros ------------------------ +#define C66XX_get_emif16_awccr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR) +#define C66XX_set_emif16_awccr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_awccr_wp1() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP1) +#define C66XX_set_emif16_awccr_wp1(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP1, v) +#define C66XX_get_emif16_awccr_wp0() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP0) +#define C66XX_set_emif16_awccr_wp0(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_WP0, v) +#define C66XX_get_emif16_awccr_cs5_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS5_WAIT) +#define C66XX_set_emif16_awccr_cs5_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS5_WAIT, v) +#define C66XX_get_emif16_awccr_cs4_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS4_WAIT) +#define C66XX_set_emif16_awccr_cs4_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS4_WAIT, v) +#define C66XX_get_emif16_awccr_cs3_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS3_WAIT) +#define C66XX_set_emif16_awccr_cs3_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS3_WAIT, v) +#define C66XX_get_emif16_awccr_cs2_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS2_WAIT) +#define C66XX_set_emif16_awccr_cs2_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_CS2_WAIT, v) +#define C66XX_get_emif16_awccr_max_ext_wait() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_MAX_EXT_WAIT) +#define C66XX_set_emif16_awccr_max_ext_wait(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_AWCCR_RG_ADDR, EMIF16_AWCCR_MAX_EXT_WAIT, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_AWCCR_WP1_ON C66XX_set_emif16_awccr_wp1(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_WP1_OFF C66XX_set_emif16_awccr_wp1(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_WP0_ON C66XX_set_emif16_awccr_wp0(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_WP0_OFF C66XX_set_emif16_awccr_wp0(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS5_WAIT1 C66XX_set_emif16_awccr_cs5_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS5_WAIT0 C66XX_set_emif16_awccr_cs5_wait(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS4_WAIT1 C66XX_set_emif16_awccr_cs4_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS4_WAIT0 C66XX_set_emif16_awccr_cs4_wait(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS3_WAIT1 C66XX_set_emif16_awccr_cs3_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS3_WAIT0 C66XX_set_emif16_awccr_cs3_wait(C66XX_OFF) +#define C66XX_SET_EMIF16_AWCCR_CS2_WAIT1 C66XX_set_emif16_awccr_cs2_wait(C66XX_ON) +#define C66XX_SET_EMIF16_AWCCR_CS2_WAIT0 C66XX_set_emif16_awccr_cs2_wait(C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_AWCCR_WP1_IS_ON (C66XX_get_emif16_awccr_wp1() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_WP0_IS_ON (C66XX_get_emif16_awccr_wp0() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS5_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs5_wait() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS4_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs4_wait() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS3_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs3_wait() == C66XX_ON) +#define C66XX_EMIF16_AWCCR_CS2_WAIT_IS_WAIT1 (C66XX_get_emif16_awccr_cs2_wait() == C66XX_ON) + + +//------------ Async config registers macros ---------------------------------- +// i index corresonds to Async config registers number +#define C66XX_get_emif16_acr_rg_addr(i) (C66XX_EMIF16_A1CR_RG_ADDR + i * 0x4) +#define C66XX_get_emif16_acr_rg(i) C66XX_GET_RG_VALUE(C66XX_get_emif16_acr_rg_addr(i)) +#define C66XX_set_emif16_acr_rg(i,v) C66XX_SET_RG_VALUE(C66XX_get_emif16_acr_rg_addr(i), v) + + // dedicated bit specific macros +#define C66XX_get_emif16_acr_ss(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_SS) +#define C66XX_set_emif16_acr_ss(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_SS, v) +#define C66XX_get_emif16_acr_ew(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_EW) +#define C66XX_set_emif16_acr_ew(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_EW, v) +#define C66XX_get_emif16_acr_w_setup(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_SETUP) +#define C66XX_set_emif16_acr_w_setup(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_SETUP, v) +#define C66XX_get_emif16_acr_w_strobe(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_STROBE) +#define C66XX_set_emif16_acr_w_strobe(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_STROBE, v) +#define C66XX_get_emif16_acr_w_hold(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_HOLD) +#define C66XX_set_emif16_acr_w_hold(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_W_HOLD, v) +#define C66XX_get_emif16_acr_r_setup(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_SETUP) +#define C66XX_set_emif16_acr_r_setup(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_SETUP, v) +#define C66XX_get_emif16_acr_r_strobe(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_STROBE) +#define C66XX_set_emif16_acr_r_strobe(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_STROBE, v) +#define C66XX_get_emif16_acr_r_hold(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_HOLD) +#define C66XX_set_emif16_acr_r_hold(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_R_HOLD, v) +#define C66XX_get_emif16_acr_ta(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_TA) +#define C66XX_set_emif16_acr_ta(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_TA, v) +#define C66XX_get_emif16_acr_asize(i) C66XX_GET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_ASIZE) +#define C66XX_set_emif16_acr_asize(i,v) C66XX_SET_FIELD_VALUE(C66XX_get_emif16_acr_rg_addr(i), EMIF16_A1CR_ASIZE, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_ACR_SS_ON(i) C66XX_set_emif16_acr_ss(i, C66XX_ON) +#define C66XX_SET_EMIF16_ACR_SS_OFF(i) C66XX_set_emif16_acr_ss(i, C66XX_OFF) +#define C66XX_SET_EMIF16_ACR_EW_ON(i) C66XX_set_emif16_acr_ew(i, C66XX_ON) +#define C66XX_SET_EMIF16_ACR_EW_OFF(i) C66XX_set_emif16_acr_ew(i, C66XX_OFF) +#define C66XX_SET_EMIF16_ACR_ASIZE_16BIT(i) C66XX_set_emif16_acr_asize(i, C66XX_EMIF16_A1CR_ASIZE_16BIT) +#define C66XX_SET_EMIF16_ACR_ASIZE_8BIT(i) C66XX_set_emif16_acr_asize(i, C66XX_EMIF16_A1CR_ASIZE_8BIT) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_ACR_SS_IS_ON(i) (C66XX_get_emif16_acr_ss(i) == C66XX_ON) +#define C66XX_EMIF16_ACR_EW_IS_ON(i) (C66XX_get_emif16_acr_ew(i) == C66XX_ON) +#define C66XX_EMIF16_ACR_ASIZE_IS_16BIT(i) (C66XX_get_emif16_acr_asize(i) == C66XX_EMIF16_A1CR_ASIZE_16BIT) + + +//------------ Interrupt raw register macros ---------------------------------- +#define C66XX_get_emif16_irr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IRR_RG_ADDR) +#define C66XX_set_emif16_irr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IRR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_irr_wr() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_WR) +#define C66XX_set_emif16_irr_wr(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_WR, v) +#define C66XX_get_emif16_irr_at() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_AT) +#define C66XX_set_emif16_irr_at(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IRR_RG_ADDR, EMIF16_IRR_AT, v) + + // direct bit set macros +#define C66XX_CLEAR_EMIF16_IRR_AT C66XX_set_emif16_irr_at(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IRR_AT_IS_ON (C66XX_get_emif16_irr_at() == C66XX_ON) + + +//------------ Interrupt masked register macros ------------------------------- +#define C66XX_get_emif16_imr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IMR_RG_ADDR) +#define C66XX_set_emif16_imr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IMR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_imr_wr_masked() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_WR_MASKED) +#define C66XX_set_emif16_imr_wr_masked(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_WR_MASKED, v) +#define C66XX_get_emif16_imr_at_masked() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_AT_MASKED) +#define C66XX_set_emif16_imr_at_masked(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMR_RG_ADDR, EMIF16_IMR_AT_MASKED, v) + + // direct bit set macros +#define C66XX_CLEAR_EMIF16_IMR_AT_MASKED C66XX_set_emif16_imr_at_masked(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IMR_AT_MASKED_IS_ON (C66XX_get_emif16_imr_at_masked() == C66XX_ON) + + +//------------ Interrupt mask set register macros ----------------------------- +#define C66XX_get_emif16_imsr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IMSR_RG_ADDR) +#define C66XX_set_emif16_imsr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_imsr_wr_mask_set() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_WR_MASK_SET) +#define C66XX_set_emif16_imsr_wr_mask_set(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_WR_MASK_SET, v) +#define C66XX_get_emif16_imsr_at_mask_set() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_AT_MASK_SET) +#define C66XX_set_emif16_imsr_at_mask_set(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMSR_RG_ADDR, EMIF16_IMSR_AT_MASK_SET, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_IMSR_AT_MASK_SET_ON C66XX_set_emif16_imsr_at_mask_set(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IMSR_AT_MASK_SET_IS_ON (C66XX_get_emif16_imsr_at_mask_set() == C66XX_ON) + + +//------------ Interrupt mask clear register macros ----------------------------- +#define C66XX_get_emif16_imcr_rg() C66XX_GET_RG_VALUE(C66XX_EMIF16_IMCR_RG_ADDR) +#define C66XX_set_emif16_imcr_rg(v) C66XX_SET_RG_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, v) + + // dedicated bit specific macros +#define C66XX_get_emif16_imcr_wr_mask_clr() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_WR_MASK_CLR) +#define C66XX_set_emif16_imcr_wr_mask_clr(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_WR_MASK_CLR, v) +#define C66XX_get_emif16_imcr_at_mask_clr() C66XX_GET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_AT_MASK_CLR) +#define C66XX_set_emif16_imcr_at_mask_clr(v) C66XX_SET_FIELD_VALUE(C66XX_EMIF16_IMCR_RG_ADDR, EMIF16_IMCR_AT_MASK_CLR, v) + + // direct bit set macros +#define C66XX_SET_EMIF16_IMCR_AT_MASK_CLR_ON C66XX_set_emif16_imcr_at_mask_clr(C66XX_ON) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_EMIF16_IMCR_AT_MASK_CLR_IS_ON (C66XX_get_emif16_imcr_at_mask_clr() == C66XX_ON) +//============================================================================= + + + +//============================================================================= +//============ Timer registers macros ========================================= +//============================================================================= + +//------------ Emulation Management and Clock Speed register macros ----------- +#define C66XX_get_timer_emumgt_clkspd_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_EMUMGT_CLKSPD_RG_ADDR(timer)) + + // dedicated bit specific macros +#define C66XX_get_timer_emumgt_clkspd_clkdiv(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_EMUMGT_CLKSPD_RG_ADDR(timer), TIMER_EMUMGT_CLKSPD_CLKDIV) + + +//------------ Counter register low register macros --------------------------- +#define C66XX_get_timer_cntlo_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CNTLO_RG_ADDR(timer)) +#define C66XX_set_timer_cntlo_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CNTLO_RG_ADDR(timer), v) + + +//------------ Counter register high register macros -------------------------- +#define C66XX_get_timer_cnthi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CNTHI_RG_ADDR(timer)) +#define C66XX_set_timer_cnthi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CNTHI_RG_ADDR(timer), v) + + +//------------ Period register low register macros ---------------------------- +#define C66XX_get_timer_prdlo_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_PRDLO_RG_ADDR(timer)) +#define C66XX_set_timer_prdlo_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_PRDLO_RG_ADDR(timer), v) + + +//------------ Period register high register macros --------------------------- +#define C66XX_get_timer_prdhi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_PRDHI_RG_ADDR(timer)) +#define C66XX_set_timer_prdhi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_PRDHI_RG_ADDR(timer), v) + + +//------------ Timer control register macros ---------------------------------- +#define C66XX_get_timer_tcr_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer)) +#define C66XX_set_timer_tcr_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_tcr_readrstmode_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_HI) +#define C66XX_set_timer_tcr_readrstmode_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_HI, v) +#define C66XX_get_timer_tcr_enamode_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_HI) +#define C66XX_set_timer_tcr_enamode_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_HI, v) +#define C66XX_get_timer_tcr_pwid_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_HI) +#define C66XX_set_timer_tcr_pwid_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_HI, v) +#define C66XX_get_timer_tcr_cp_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_HI) +#define C66XX_set_timer_tcr_cp_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_HI, v) +#define C66XX_get_timer_tcr_invoutp_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_HI) +#define C66XX_set_timer_tcr_invoutp_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_HI, v) +#define C66XX_get_timer_tcr_tstat_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TSTAT_HI) +#define C66XX_get_timer_tcr_capevtmode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPEVTMODE_LO) +#define C66XX_set_timer_tcr_capevtmode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPEVTMODE_LO, v) +#define C66XX_get_timer_tcr_capmode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPMODE_LO) +#define C66XX_set_timer_tcr_capmode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CAPMODE_LO, v) +#define C66XX_get_timer_tcr_readrstmode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_LO) +#define C66XX_set_timer_tcr_readrstmode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_READRSTMODE_LO, v) +#define C66XX_get_timer_tcr_tien_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TIEN_LO) +#define C66XX_set_timer_tcr_tien_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TIEN_LO, v) +#define C66XX_get_timer_tcr_clksrc_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CLKSRC_LO) +#define C66XX_set_timer_tcr_clksrc_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CLKSRC_LO, v) +#define C66XX_get_timer_tcr_enamode_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_LO) +#define C66XX_set_timer_tcr_enamode_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_ENAMODE_LO, v) +#define C66XX_get_timer_tcr_pwid_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_LO) +#define C66XX_set_timer_tcr_pwid_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_PWID_LO, v) +#define C66XX_get_timer_tcr_cp_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_LO) +#define C66XX_set_timer_tcr_cp_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_CP_LO, v) +#define C66XX_get_timer_tcr_invinp_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVINP_LO) +#define C66XX_set_timer_tcr_invinp_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVINP_LO, v) +#define C66XX_get_timer_tcr_invoutp_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_LO) +#define C66XX_set_timer_tcr_invoutp_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_INVOUTP_LO, v) +#define C66XX_get_timer_tcr_tstat_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TCR_RG_ADDR(timer), TIMER_TCR_TSTAT_LO) + + // direct bit set macros +#define C66XX_SET_TIMER_TCR_READRSTMODE_HI_ON(timer) C66XX_set_timer_tcr_readrstmode_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_READRSTMODE_HI_OFF(timer) C66XX_set_timer_tcr_readrstmode_hi(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_DISABLED(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_ONE_SHOT(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_CONT(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_SET_TIMER_TCR_ENAMODE_HI_CONT_RELOAD(timer) C66XX_set_timer_tcr_enamode_hi(timer, C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_SET_TIMER_TCR_PWID_HI_1_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_SET_TIMER_TCR_PWID_HI_2_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_SET_TIMER_TCR_PWID_HI_3_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_SET_TIMER_TCR_PWID_HI_4_CLK(timer) C66XX_set_timer_tcr_pwid_hi(timer, C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_SET_TIMER_TCR_CP_HI_ON(timer) C66XX_set_timer_tcr_cp_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CP_HI_OFF(timer) C66XX_set_timer_tcr_cp_hi(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_INVOUTP_HI_ON(timer) C66XX_set_timer_tcr_invoutp_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_INVOUTP_HI_OFF(timer) C66XX_set_timer_tcr_invoutp_hi(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_CAPEVTMODE_LO_RISING_EDGE(timer) C66XX_set_timer_tcr_capevtmode_lo(timer, C66XX_TIMER_TCR_CAPEVTMODE_RISING_EDGE) +#define C66XX_SET_TIMER_TCR_CAPEVTMODE_LO_FALLING_EDGE(timer) C66XX_set_timer_tcr_capevtmode_lo(timer, C66XX_TIMER_TCR_CAPEVTMODE_FALLING_EDGE) +#define C66XX_SET_TIMER_TCR_CAPEVTMODE_LO_ANY_EDGE(timer) C66XX_set_timer_tcr_capevtmode_lo(timer, C66XX_TIMER_TCR_CAPEVTMODE_ANY_EDGE) +#define C66XX_SET_TIMER_TCR_CAPMODE_LO_ON(timer) C66XX_set_timer_tcr_capmode_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CAPMODE_LO_OFF(timer) C66XX_set_timer_tcr_capmode_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_READRSTMODE_LO_ON(timer) C66XX_set_timer_tcr_readrstmode_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_READRSTMODE_LO_OFF(timer) C66XX_set_timer_tcr_readrstmode_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_TIEN_LO_ON(timer) C66XX_set_timer_tcr_tien_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_TIEN_LO_OFF(timer) C66XX_set_timer_tcr_tien_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_CLKSRC_LO_ON(timer) C66XX_set_timer_tcr_clksrc_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CLKSRC_LO_OFF(timer) C66XX_set_timer_tcr_clksrc_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_DISABLED(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_ONE_SHOT(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_CONT(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_SET_TIMER_TCR_ENAMODE_LO_CONT_RELOAD(timer) C66XX_set_timer_tcr_enamode_lo(timer, C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_SET_TIMER_TCR_PWID_LO_1_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_SET_TIMER_TCR_PWID_LO_2_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_SET_TIMER_TCR_PWID_LO_3_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_SET_TIMER_TCR_PWID_LO_4_CLK(timer) C66XX_set_timer_tcr_pwid_lo(timer, C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_SET_TIMER_TCR_CP_LO_ON(timer) C66XX_set_timer_tcr_cp_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_CP_LO_OFF(timer) C66XX_set_timer_tcr_cp_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_INVINP_LO_ON(timer) C66XX_set_timer_tcr_invinp_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_INVINP_LO_OFF(timer) C66XX_set_timer_tcr_invinp_lo(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TCR_INVOUTP_LO_ON(timer) C66XX_set_timer_tcr_invoutp_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_TCR_INVOUTP_LO_OFF(timer) C66XX_set_timer_tcr_invoutp_lo(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_TCR_READRSTMODE_HI_IS_ON(timer) (C66XX_get_timer_tcr_readrstmode_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_DISABLED(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_ONE_SHOT(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_CONT(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_TIMER_TCR_ENAMODE_HI_IS_CONT_RELOAD(timer) (C66XX_get_timer_tcr_enamode_hi(timer) == C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_TIMER_TCR_PWI_HI_IS_1_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_TIMER_TCR_PWI_HI_IS_2_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_TIMER_TCR_PWI_HI_IS_3_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_TIMER_TCR_PWI_HI_IS_4_CLK(timer) (C66XX_get_timer_tcr_pwid_hi(timer) == C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_TIMER_TCR_CP_HI_IS_ON(timer) (C66XX_get_timer_tcr_cp_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_INVOUTP_HI_IS_ON(timer) (C66XX_get_timer_tcr_invoutp_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_TSTAT_HI_IS_ON(timer) (C66XX_get_timer_tcr_tstat_hi(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_IS_RISING_EDGE(timer) (C66XX_get_timer_tcr_capevtmode_lo(timer) == C66XX_TIMER_TCR_CAPEVTMODE_RISING_EDGE) +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_IS_FALLING_EDGE(timer) (C66XX_get_timer_tcr_capevtmode_lo(timer) == C66XX_TIMER_TCR_CAPEVTMODE_FALLING_EDGE) +#define C66XX_TIMER_TCR_CAPEVTMODE_LO_IS_ANY_EDGE(timer) (C66XX_get_timer_tcr_capevtmode_lo(timer) == C66XX_TIMER_TCR_CAPEVTMODE_ANY_EDGE) +#define C66XX_TIMER_TCR_CAPMODE_LO_IS_ON(timer) (C66XX_get_timer_tcr_capmode_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_READRSTMODE_LO_IS_ON(timer) (C66XX_get_timer_tcr_readrstmode_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_TIEN_LO_IS_ON(timer) (C66XX_get_timer_tcr_tien_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_CLKSRC_LO_IS_ON(timer) (C66XX_get_timer_tcr_clksrc_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_DISABLED(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_DISABLED) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_ONE_SHOT(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_ONE_SHOT) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_CONT(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_CONT) +#define C66XX_TIMER_TCR_ENAMODE_LO_IS_CONT_RELOAD(timer) (C66XX_get_timer_tcr_enamode_lo(timer) == C66XX_TIMER_TCR_ENAMODE_CONT_RELOAD) +#define C66XX_TIMER_TCR_PWI_LO_IS_1_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_1_CLK) +#define C66XX_TIMER_TCR_PWI_LO_IS_2_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_2_CLK) +#define C66XX_TIMER_TCR_PWI_LO_IS_3_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_3_CLK) +#define C66XX_TIMER_TCR_PWI_LO_IS_4_CLK(timer) (C66XX_get_timer_tcr_pwid_lo(timer) == C66XX_TIMER_TCR_PWID_4_CLK) +#define C66XX_TIMER_TCR_CP_LO_IS_ON(timer) (C66XX_get_timer_tcr_cp_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_INVINP_LO_IS_ON(timer) (C66XX_get_timer_tcr_invinp_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_INVOUTP_LO_IS_ON(timer) (C66XX_get_timer_tcr_invoutp_lo(timer) == C66XX_ON) +#define C66XX_TIMER_TCR_TSTAT_LO_IS_ON(timer) (C66XX_get_timer_tcr_tstat_lo(timer) == C66XX_ON) + + +//------------ Timer global control register macros --------------------------- +#define C66XX_get_timer_tgcr_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer)) +#define C66XX_set_timer_tgcr_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_tgcr_tddrhi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TDDRHI) +#define C66XX_set_timer_tgcr_tddrhi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TDDRHI, v) +#define C66XX_get_timer_tgcr_pschi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PSCHI) +#define C66XX_set_timer_tgcr_pschi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PSCHI, v) +#define C66XX_get_timer_tgcr_plusen(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PLUSEN) +#define C66XX_set_timer_tgcr_plusen(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_PLUSEN, v) +#define C66XX_get_timer_tgcr_timmode(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMMODE) +#define C66XX_set_timer_tgcr_timmode(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMMODE, v) +#define C66XX_get_timer_tgcr_timhirs(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMHIRS) +#define C66XX_set_timer_tgcr_timhirs(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMHIRS, v) +#define C66XX_get_timer_tgcr_timlors(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMLORS) +#define C66XX_set_timer_tgcr_timlors(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_TGCR_RG_ADDR(timer), TIMER_TGCR_TIMLORS, v) + + // direct bit set macros +#define C66XX_SET_TIMER_TGCR_PLUSEN_ON(timer) C66XX_set_timer_tgcr_plusen(timer, C66XX_ON) +#define C66XX_SET_TIMER_TGCR_PLUSEN_OFF(timer) C66XX_set_timer_tgcr_plusen(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TGCR_TIMMODE_64BIT_GPT(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_64BIT_GPT) +#define C66XX_SET_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED) +#define C66XX_SET_TIMER_TGCR_TIMMODE_64BIT_WDT(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_64BIT_WDT) +#define C66XX_SET_TIMER_TGCR_TIMMODE_32BIT_CHAINED(timer) C66XX_set_timer_tgcr_timmode(timer, C66XX_TIMER_TGCR_TIMMODE_32BIT_CHAINED) +#define C66XX_SET_TIMER_TGCR_TIMHIRS_ON(timer) C66XX_set_timer_tgcr_timhirs(timer, C66XX_ON) +#define C66XX_SET_TIMER_TGCR_TIMHIRS_OFF(timer) C66XX_set_timer_tgcr_timhirs(timer, C66XX_OFF) +#define C66XX_SET_TIMER_TGCR_TIMLORS_ON(timer) C66XX_set_timer_tgcr_timlors(timer, C66XX_ON) +#define C66XX_SET_TIMER_TGCR_TIMLORS_OFF(timer) C66XX_set_timer_tgcr_timlors(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_TGCR_PLUSEN_IS_ON(timer) (C66XX_get_timer_tgcr_plusen(timer) == C66XX_ON) +#define C66XX_TIMER_TGCR_TIMMODE_IS_64BIT_GPT(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_64BIT_GPT) +#define C66XX_TIMER_TGCR_TIMMODE_IS_32BIT_UNCHAINED(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_32BIT_UNCHAINED) +#define C66XX_TIMER_TGCR_TIMMODE_IS_64BIT_WDT(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_64BIT_WDT) +#define C66XX_TIMER_TGCR_TIMMODE_IS_32BIT_CHAINED(timer) (C66XX_get_timer_tgcr_timmode(timer) == C66XX_TIMER_TGCR_TIMMODE_32BIT_CHAINED) +#define C66XX_TIMER_TGCR_TIMHIRS_IS_ON(timer) (C66XX_get_timer_tgcr_timhirs(timer) == C66XX_ON) +#define C66XX_TIMER_TGCR_TIMLORS_IS_ON(timer) (C66XX_get_timer_tgcr_timlors(timer) == C66XX_ON) + + +//------------ Watchdog Timer Control Register macros ------------------------- +#define C66XX_get_timer_wdtcr_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer)) +#define C66XX_set_timer_wdtcr_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_wdtcr_wdkey(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDKEY) +#define C66XX_set_timer_wdtcr_wdkey(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDKEY, v) +#define C66XX_get_timer_wdtcr_wdflag(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDFLAG) +#define C66XX_set_timer_wdtcr_wdflag(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDFLAG, v) +#define C66XX_get_timer_wdtcr_wden(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDEN) +#define C66XX_set_timer_wdtcr_wden(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_WDTCR_RG_ADDR(timer), TIMER_WDTCR_WDEN, v) + + // direct bit set macros +#define C66XX_SET_TIMER_WDTCR_WDKEY_FIRST_KEY(timer) C66XX_set_timer_wdtcr_wdkey(timer, C66XX_TIMER_WDTCR_WDKEY_FIRST_KEY) +#define C66XX_SET_TIMER_WDTCR_WDKEY_SECOND_KEY(timer) C66XX_set_timer_wdtcr_wdkey(timer, C66XX_TIMER_WDTCR_WDKEY_SECOND_KEY) +#define C66XX_SET_TIMER_WDTCR_WDFLAG_ON(timer) C66XX_set_timer_wdtcr_wdflag(timer, C66XX_ON) +#define C66XX_SET_TIMER_WDTCR_WDFLAG_OFF(timer) C66XX_set_timer_wdtcr_wdflag(timer, C66XX_OFF) +#define C66XX_SET_TIMER_WDTCR_WDEN_ON(timer) C66XX_set_timer_wdtcr_wden(timer, C66XX_ON) +#define C66XX_SET_TIMER_WDTCR_WDEN_OFF(timer) C66XX_set_timer_wdtcr_wden(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_WDTCR_WDFLAG_IS_ON(timer) (C66XX_get_timer_wdtcr_wdflag(timer) == C66XX_ON) +#define C66XX_TIMER_WDTCR_WDEN_IS_ON(timer) (C66XX_get_timer_wdtcr_wden(timer) == C66XX_ON) + + +//------------ Timer Reload register low register macros ---------------------- +#define C66XX_get_timer_rello_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_RELLO_RG_ADDR(timer)) +#define C66XX_set_timer_rello_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_RELLO_RG_ADDR(timer), v) + + +//------------ Timer Reload register high register macros --------------------- +#define C66XX_get_timer_relhi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_RELHI_RG_ADDR(timer)) +#define C66XX_set_timer_relhi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_RELHI_RG_ADDR(timer), v) + + +//------------ Timer Capture register low register macros --------------------- +#define C66XX_get_timer_caplo_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CAPLO_RG_ADDR(timer)) +#define C66XX_set_timer_caplo_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CAPLO_RG_ADDR(timer), v) + + +//------------ Timer Capture register high register macros -------------------- +#define C66XX_get_timer_caphi_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_CAPHI_RG_ADDR(timer)) +#define C66XX_set_timer_caphi_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_CAPHI_RG_ADDR(timer), v) + + +//------------ Timer interrupt control and status register macros ------------- +#define C66XX_get_timer_intctlstat_rg(timer) C66XX_GET_RG_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer)) +#define C66XX_set_timer_intctlstat_rg(timer,v) C66XX_SET_RG_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), v) + + // dedicated bit specific macros +#define C66XX_get_timer_intctlstat_evtintstat_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_HI) +#define C66XX_set_timer_intctlstat_evtintstat_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_HI, v) +#define C66XX_get_timer_intctlstat_evtinten_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_HI) +#define C66XX_set_timer_intctlstat_evtinten_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_HI, v) +#define C66XX_get_timer_intctlstat_prdintstat_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_HI) +#define C66XX_set_timer_intctlstat_prdintstat_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_HI, v) +#define C66XX_get_timer_intctlstat_prdinten_hi(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_HI) +#define C66XX_set_timer_intctlstat_prdinten_hi(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_HI, v) +#define C66XX_get_timer_intctlstat_evtintstat_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_LO) +#define C66XX_set_timer_intctlstat_evtintstat_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTSTAT_LO, v) +#define C66XX_get_timer_intctlstat_evtinten_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_LO) +#define C66XX_set_timer_intctlstat_evtinten_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_EVTINTEN_LO, v) +#define C66XX_get_timer_intctlstat_prdintstat_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_LO) +#define C66XX_set_timer_intctlstat_prdintstat_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTSTAT_LO, v) +#define C66XX_get_timer_intctlstat_prdinten_lo(timer) C66XX_GET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_LO) +#define C66XX_set_timer_intctlstat_prdinten_lo(timer,v) C66XX_SET_FIELD_VALUE(C66XX_TIMER_INTCTLSTAT_RG_ADDR(timer), TIMER_INTCTLSTAT_PRDINTEN_LO, v) + + // direct bit set macros +#define C66XX_CLEAR_TIMER_INTCTLSTAT_EVTINTSTAT_HI(timer) C66XX_set_timer_intctlstat_evtintstat_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_HI_ON(timer) C66XX_set_timer_intctlstat_evtinten_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_HI_OFF(timer) C66XX_set_timer_intctlstat_evtinten_hi(timer, C66XX_OFF) +#define C66XX_CLEAR_TIMER_INTCTLSTAT_PRDINTSTAT_HI(timer) C66XX_set_timer_intctlstat_prdintstat_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_HI_ON(timer) C66XX_set_timer_intctlstat_prdinten_hi(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_HI_OFF(timer) C66XX_set_timer_intctlstat_prdinten_hi(timer, C66XX_OFF) +#define C66XX_CLEAR_TIMER_INTCTLSTAT_EVTINTSTAT_LO(timer) C66XX_set_timer_intctlstat_evtintstat_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_LO_ON(timer) C66XX_set_timer_intctlstat_evtinten_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_EVTINTEN_LO_OFF(timer) C66XX_set_timer_intctlstat_evtinten_lo(timer, C66XX_OFF) +#define C66XX_CLEAR_TIMER_INTCTLSTAT_PRDINTSTAT_LO(timer) C66XX_set_timer_intctlstat_prdintstat_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_LO_ON(timer) C66XX_set_timer_intctlstat_prdinten_lo(timer, C66XX_ON) +#define C66XX_SET_TIMER_INTCTLSTAT_PRDINTEN_LO_OFF(timer) C66XX_set_timer_intctlstat_prdinten_lo(timer, C66XX_OFF) + + // condition check macros (for use in IF() and other conditional operators) +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_evtintstat_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_evtinten_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_prdintstat_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_HI_IS_ON(timer) (C66XX_get_timer_intctlstat_prdinten_hi(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_EVTINTSTAT_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_evtintstat_lo(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_EVTINTEN_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_evtinten_lo(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTSTAT_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_prdintstat_lo(timer) == C66XX_ON) +#define C66XX_TIMER_INTCTLSTAT_PRDINTEN_LO_IS_ON(timer) (C66XX_get_timer_intctlstat_prdinten_lo(timer) == C66XX_ON) + +//============================================================================= + + + +//============================================================================= +#endif /* __C66XX_MACROS_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/TA66XX_DSP.h b/ports/c667x/ccs/example_build/include/TA66XX_DSP.h new file mode 100644 index 00000000..04dfc4b7 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_DSP.h @@ -0,0 +1,251 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 4A. + General definitions and API functions. + (C) MicroLAB Systems, 2015-2017 + + + http://www.mlabsys.com + ftp://ftp.mlabsys.com + email: techsupport@mlabsys.com + + + Description: + ------------ + This file contains general definitions and API functions for TORNADO AMC + modules SDK and must be included in the user C-application for + TORNADO AMC modules. + + + Revision history: + ----------------- + rev.2A - 2015, initial release for TORNADO-A6678 board rev.1B; + rev.3A - 2016: + - added support for TORNADO-A6678/FMC board rev.1A; + rev.3B - 2017: + - added support for TORNADO-A6678/FMC board rev.1B; + rev.4A - 2017: + - added support for TORNADO-AZ/FMC board rev.1A; + + + Notes: + ------ + 1. This C-header file is an include file for TI C6xxx C/C++ Code + Generation Tools, which must be invoked to compile for C66xx DSP + platform. + + 2. This file is best viewed with the TAB setting set to '4'. + + + Copyright: + ---------- + This utility is supplied free of charge as it is without any obligation + from MicroLAB Systems. No responsibility is assumed for any use or misuse + of these utilities. + +******************************************************************************/ + + +/** + * @file TA66XX_DSP.h + * + * @brief Main include file + * + * This file contains general definitions and API functions for TORNADO + * AMC modules SDK + * + */ + + +#ifndef __TA66XX_DSP_H__ // check for this file has been already included +#define __TA66XX_DSP_H__ 1 + + +// General defs +#define TA66XX_ON 1 +#define TA66XX_OFF 0 + + +// Include C66xx DSP defs, macros and aux functions +#include "C66XX.h" +// Include TORNADO AMC SDK functions errors +#include "TASDK_ERR.h" + + + +//============================================================================= +/** TORNADO AMC SDK revision ID */ +#define TA66XX_SDK_REVISION_ID "4A" +//============================================================================= + + + +//============================================================================= +//============ TORNADO AMC SDK API functions ID defs ========================== +//============================================================================= +/** @addtogroup TA66XX_FUNCTIONS_ID SDK API functions ID defs + * @{ + */ + + +/**< Function name max size */ +#define TA66XX_FUNCTION_NAME_LEN_MAX 64 + + +enum +{ + TA66XX_GET_ERROR_MESSAGE_FUNCTION_ID = 0, + TA66XX_GET_FUNCTION_NAME_FUNCTION_ID, + TA66XX_BC_SET_I2C_INTERRUPT_NUMBER_FUNCTION_ID, + TA66XX_BC_SET_UART_INTERRUPT_NUMBER_FUNCTION_ID, + TA66XX_BC_INIT_FUNCTION_ID, + TA66XX_BC_MAP_DSP_GPIO_INTERRUPT_FUNCTION_ID, + TA66XX_BC_UNMAP_DSP_GPIO_INTERRUPT_FUNCTION_ID, + TA66XX_BC_INIT_UART_FUNCTION_ID, + TA66XX_BC_WRITE_EEPROM_FUNCTION_ID, + TA66XX_BC_READ_EEPROM_FUNCTION_ID, + TA66XX_BC_ERASE_EEPROM_FUNCTION_ID, + TA66XX_BC_GET_DEVICE_INFO_FUNCTION_ID, + TA66XX_BC_GET_HW_CFG_INFO_FUNCTION_ID, + TA66XX_BC_GET_FMC_INFO_FUNCTION_ID, + TA66XX_BC_GET_TEMP_STATE_FUNCTION_ID, + TA66XX_BC_GET_POWER_STATE_FUNCTION_ID, + TA66XX_BC_GET_FMC_POWER_STATE_FUNCTION_ID, + TA66XX_BC_GET_SFP_INFO_FUNCTION_ID, + TA66XX_BC_SET_FPGA_HIF_CONFIG_FUNCTION_ID, + TA66XX_BC_GET_FPGA_HIF_CONFIG_FUNCTION_ID, + TA66XX_BC_CLEAR_FPGA_CNF_FUNCTION_ID, + TA66XX_BC_LOAD_FPGA_CNF_FUNCTION_ID, + TA66XX_BC_GET_GBE_PORT_INFO_FUNCTION_ID, + TA66XX_BC_INIT_GBE_PORT_FUNCTION_ID, + TA66XX_BC_ERASE_FLASH_FUNCTION_ID, + TA66XX_BC_WRITE_FLASH_FUNCTION_ID, + TA66XX_BC_READ_FLASH_FUNCTION_ID, + TA66XX_SC_INIT_FLASH_RECORD_LIST_FUNCTION_ID, + TA66XX_SC_GET_NUMBER_OF_FLASH_RECORDS_FUNCTION_ID, + TA66XX_SC_GET_FLASH_RECORD_LIST_FUNCTION_ID, + TA66XX_SC_GET_FLASH_RECORD_INFO_FUNCTION_ID, + TA66XX_SC_READ_FLASH_RECORD_DATA_FUNCTION_ID, + TA66XX_SC_CREATE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_WRITE_FLASH_RECORD_DATA_FUNCTION_ID, + TA66XX_SC_XCLOSE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_UPDATE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_DELETE_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_SQUEEZE_FLASH_RECORDS_FUNCTION_ID, + TA66XX_SC_GET_FLASH_FREE_SPACE_FUNCTION_ID, + TA66XX_SC_GET_BOOT_SEQ_FUNCTION_ID, + TA66XX_SC_DELETE_BOOT_SEQ_FUNCTION_ID, + TA66XX_SC_SET_BOOT_SEQ_FUNCTION_ID, + TA66XX_SC_LOAD_DSP_APPL_FROM_MEMORY_FUNCTION_ID, + TA66XX_SC_LOAD_DSP_APPL_FROM_FLASH_RECORD_FUNCTION_ID, + TA66XX_SC_LOAD_FPGA_CNF_FROM_FLASH_RECORD_FUNCTION_ID, + TA66XX_NUMBER_OF_FUNCTIONS +}; +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +//============================================================================= +//============ General SDK API functions declarations ========================= +//============================================================================= + +/** @addtogroup TA66XX_GENERAL TORNADO AMC SDK general API functions + * @{ + */ + +/*------------ TA66XX_set_error() function -------------------------------*//** + * @brief Function should be used on exit from SDK API functions in + * order to set error code and function ID of SDK API functions + * + * @param[in] err - error code; + * @param[in] function_id - function ID of SDK API functions; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_set_error(int32_t err, int32_t function_id); + + +/*------------ TA66XX_get_last_error() function --------------------------*//** + * @brief Function returns error code of last executed API function + * + * @return Error code of last executed API function + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_last_error(void); + + +/*------------ TA66XX_get_error_flag() function --------------------------*//** + * @brief Function returns status of ERROR_FLAG for API functions + * + * ERROR_FLAG is set by each API function in case error has been detected. + * ERROR_FLAG can be reset by TA66XX_clear_error_flag() API function + * + * @param[out] error_code - pointer to a variable to receive the error code in + * case error has been detected. In case pointer is NULL, then + * no error code is returned; + * @param[out] error_function_id - pointer to a variable to receive ID of the + * first API function, which has returned with error. In case + * pointer is NULL, then no function ID is returned; + * + * @return Status of ERROR_FLAG: ON or OFF + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_error_flag(int32_t *error_code, int32_t *error_function_id); + + +/*------------ TA66XX_clear_error_flag() function ------------------------*//** + * @brief Function clear ERROR_FLAG for API functions + * + * @return Always OK + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_clear_error_flag(void); + + +/*------------ TA66XX_get_error_message() function -----------------------*//** + * @brief Function returns the text interpretation of the error code. + * + * @param[in] error - error code to be interpreted; + * @param[out] error_message - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_error_message(int32_t error, char *error_message); + + +/*------------ TA66XX_get_function_name() function -----------------------*//** + * @brief Function returns the text interpretation of API function. + * + * @param[in] function_id - ID of the API function to be interpreted; + * @param[out] function_name - pointer to the returned string. In case pointer + * is NULL, then no text is filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_get_function_name(int32_t function_id, char *function_name); + + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __TA66XX_DSP_H__ */ + diff --git a/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h new file mode 100644 index 00000000..dbc748e0 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC.h @@ -0,0 +1,121 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 4A. + Definitions, macros and API functions for DSP Environment. + (C) MicroLAB Systems, 2014-2017 + + + http://www.mlabsys.com + ftp://ftp.mlabsys.com + email: techsupport@mlabsys.com + + + Description: + ------------ + This file contains definitions, macros and API functions for TORNADO AMC + modules on-board DSP environment and must be included in the user + C-application for TORNADO AMC modules. + + + Revision history: + ----------------- + rev.1A - 2014, initial release for TORNADO-A6678 board rev.1A. + rev.1B - 2015, fixed some bugs. + rev.1C - 2015, added support for TORNADO-A6678 board rev.1B: + - updated DSP external control registers area; + - updated TA66XX_init_dsp() DSP initialization + function; + - added MMC-to-DSP communication functions in DSP + I2C functions. + rev.2A - 2015, totally redesigned SDK for TORNADO-A6678 board rev.1B; + rev.3A - 2016, added support for TORNADO-A6678/FMC board rev.1A; + rev.3B - 2017: + - added support for TORNADO-A6678/FMC board rev.1B; + rev.4A - 2017: + - added support for TORNADO-AZ/FMC board rev.1A; + + + Notes: + ------ + 1. This C-header file is an include file for TI C6xxx C/C++ Code + Generation Tools, which must be invoked to compile for C66xx DSP + platform. + + 2. This file is best viewed with the TAB setting set to '4'. + + 3. This library uses dynamic memory allocation in erase FLASH functions, + so user should provide enough memory area for dynamic memory allocation + (-heap parameter) and place the section (.sysmem) in the corresponding + memory area in linker command file. + The max requested memory allocation block length is up to FLASH memory + sector length in bytes (128 KB). + + 4. This header file is externally controlled from user C-code by run-time + compiler keys definitions in order to apply board-type specific + definitions to refer to particular definitions included for different + board type: + + __TA66XX_BC_USE_BIOS__ + - if defined in user code prior inclusion of this header file, + then TI SYS/BIOS modules(HWI (Hardware Interrupt) and ECM + (Event Combiner Manager)), will be used to support + C66xx CorePac interrupt controller (INTC). + TI INTC Chip Support Library (CSL) should be used in case + NO embedded operating system is used in user application. + DEFAULT is NOT DEFINED, so CSL INTC library will be used + to support C66xx CorePac interrupt controller. + + Copyright: + ---------- + This utility is supplied free of charge as it is without any obligation + from MicroLAB Systems. No responsibility is assumed for any use or misuse + of these utilities. + +******************************************************************************/ + + +/** + * @file TA66XX_DSP_BC.h + * + * @brief Main include file + * + * This file contains definitions, macros and API functions for TORNADO + * AMC modules on-board DSP environment + * + */ + + +#ifndef __TA66XX_DSP_BC_H__ // check for this file has been already included +#define __TA66XX_DSP_BC_H__ 1 + + +#if defined __TA66XX_BC_USE_BIOS__ +// Include this file to prevent compiler errors +// when using SYS/BIOS +#include +#endif /* __TA66XX_BC_USE_BIOS__ */ + + +// Include general TORNADO AMC SDK defs +#include "TA66XX_DSP.h" + + +//============================================================================= +//------------ board-type specific run-time compiler keys processing ---------- +// (this is required in order to exclude key confusions) + +// Default setting is C6678 DSP definitions +#define __C66XX_SELECT_C6678_DSP__ 1 + +// Finally we must define C-code data type for accessing I/O areas +typedef volatile uint16_t __TA66XX_BC_DSP_XCR_RG_DATA_TYPE__; +typedef volatile uint16_t __TA66XX_BC_FLASH_DATA_TYPE__; +//============================================================================= + + +// Include TORNADO AMC SDK functions +#include "TA66XX_DSP_BC_FUNCTIONS.hxx" + + +//============================================================================= +#endif /* __TA66XX_DSP_BC_H__ */ + diff --git a/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx new file mode 100644 index 00000000..338a01ee --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_DSP_BC_FUNCTIONS.hxx @@ -0,0 +1,1732 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 3B. + (C) MicroLAB Systems, 2014-2017 + + File: TORNADO AMC SDK functions for DSP environment declarations + ----- + + Notes: + ------ + 1. This C-header file contains TORNADO AMC modules SDK functions + for DSP environment declarations and is an include file for + TI C6xxx C/C++ Code Generation Tools, which must be invoked to compile + for TORNADO AMC platform. + + 2. This file is best viewed with the TAB setting set to '4'. + +******************************************************************************/ + + +/** + * @file TA66XX_DSP_BC_FUNCTIONS.hxx + * + * @brief Board control (BC) SDK functions declarations + * + * This file contains declarations of TORNADO AMC modules SDK functions for + * board control + * + */ + + +#ifndef __TA66XX_DSP_BC_FUNCTIONS_HXX__ // check for this file has been already included +#define __TA66XX_DSP_BC_FUNCTIONS_HXX__ 1 + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +//============================================================================= +//============ DSP environment functions ====================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_INIT TORNADO AMC DSP environment init functions + * @{ + */ + + +/** Default DSP interrupt vector for DSP I2C interrupt */ +#define TA66XX_BC_I2C_INTERRUPT_NUMBER_USED 4 + + +/*------------ TA66XX_BC_set_i2c_interrupt_number() function -------------*//** + * @brief Function should be called before calling TA66XX_BC_init() function + * and is used to select DSP interrupt vector number for DSP I2C interrupt. + * + * @param[in] dsp_vector_id - DSP interrupt vector number, which will be used + * for DSP I2C interrupt. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_i2c_interrupt_number(uint32_t dsp_vector_id); + + +/*------------ TA66XX_BC_get_i2c_interrupt_number() function -------------*//** + * @brief Function returns current DSP interrupt vector number for DSP I2C + * interrupt. + * + * @return DSP interrupt vector number, which is used for DSP I2C interrupt. + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_i2c_interrupt_number(void); + + +/** Default DSP interrupt vector for DSP UART interrupt */ +#define TA66XX_BC_UART_INTERRUPT_NUMBER_USED 5 + + +/*------------ TA66XX_BC_set_uart_interrupt_number() function ------------*//** + * @brief Function should be called before calling TA66XX_BC_init() function + * and is used to select DSP interrupt vector number for DSP UART interrupt. + * + * @param[in] dsp_vector_id - DSP interrupt vector number, which will be used + * for DSP UART interrupt. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_uart_interrupt_number(uint32_t dsp_vector_id); + + +/*------------ TA66XX_BC_get_uart_interrupt_number() function ------------*//** + * @brief Function returns current DSP interrupt vector number for DSP UART + * interrupt. + * + * @return DSP interrupt vector number, which is used for DSP UART interrupt. + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_uart_interrupt_number(void); + + +/*------------ TA66XX_BC_init() function ---------------------------------*//** + * @brief Function performs initialization of TORNADO AMC modules + * DSP environment in accordance with board type + * + * The function does the following: + * 1. DSP on-chip caches are configured by default: L1P and L1D caches are + * enabled and set to max available size, L2 cache is disabled so L2 memory + * acts as SRAM. + * 2. DSP main PLL, DDR3 PLL and PASS PLL are configured by default: DSP core + * clock is set to TA66XX_BC_DSP_CORE_SPEED_VALUE, DDR3 and PASS controllers + * to default values + * 3. DDR3 memory is configured and ready to use + * 4. All DSP power domains are enabled + * 5. DSP EMIF-16 bus is configured. + * 6. In case external 1GE interface is installed then DSP SGMII port is + * initialized. + * 7. DSP GPIO pins are configured as outputs and cleared. + * 8. DSP LEDs are enabled. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_init(void); + + +/*------------ TA66XX_BC_get_ddr_area_base_addr() function ---------------*//** + * @brief Function returns DDR3 area base address + * + * @return DDR3 area base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_ddr_area_base_addr(void); + + +/*------------ TA66XX_BC_get_ddr_area_length() function ------------------*//** + * @brief Function returns DDR3 area length in bytes + * + * @return DDR3 area length in bytes + * +-----------------------------------------------------------------------------*/ +uint64_t TA66XX_BC_get_ddr_area_length(void); + + +//----------------------------------------------------------------------------- +// These functions are used to map either lower 2 GB DDR3 page or high 2 GB +// DDR3 page of 4GB DDR3 memory area to DSP 32-bit logical memory map. + +/** The lower 2GB DDR3 memory page */ +#define TA66XX_BC_DDR3_MEM_PAGE0 0 +/** The high 2GB DDR3 memory page */ +#define TA66XX_BC_DDR3_MEM_PAGE1 1 +//----------------------------------------------------------------------------- + +/*------------ TA66XX_BC_set_ddr_area_page() function --------------------*//** + * @brief Function sets the specified 2 GB DDR3 memory page (0 or 1) to be + * mapped to DSP 32-bit logical memory map. + * + * This function should be used only in case of 4 GB and more DDR3 memory is + * installed otherwise it does nothing. + * + * @param[in] page - 2 GB DDR3 memory page (0 or 1); + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_ddr_area_page(uint32_t page); + + +/*------------ TA66XX_BC_get_ddr_area_page() function --------------------*//** + * @brief Function returns current selected 2 GB DDR3 memory page (0 or 1) + * which is mapped to DSP 32-bit logical memory map. + * + * @return Current selected 2 GB DDR3 memory page (0 or 1) + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_ddr_area_page(void); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ DSP LED functions ============================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_DSP_LED TORNADO AMC DSP LED functions + * @{ + */ + +/** DSP LED definitions */ +enum TA66XX_BC_DSP_LEDS +{ + TA66XX_BC_DSP_LED0 = 0, /**< DSP LED-0 */ + TA66XX_BC_DSP_LED1, /**< DSP LED-1 */ + TA66XX_BC_DSP_LED2, /**< DSP LED-2 */ + TA66XX_BC_DSP_LED3, /**< DSP LED-3 */ + TA66XX_BC_DSP_LED4, /**< DSP LED-4 */ + TA66XX_BC_DSP_LED5, /**< DSP LED-5 */ + TA66XX_BC_DSP_LED6, /**< DSP LED-6 */ + TA66XX_BC_DSP_LED7 /**< DSP LED-7 */ +}; + +/** DSP LED bitmask definitions */ +enum TA66XX_BC_DSP_LED_BITMASKS +{ + TA66XX_BC_DSP_LED0_BITMASK = 0x0001, /**< DSP LED-0 bitmask */ + TA66XX_BC_DSP_LED1_BITMASK = 0x0002, /**< DSP LED-1 bitmask */ + TA66XX_BC_DSP_LED2_BITMASK = 0x0004, /**< DSP LED-2 bitmask */ + TA66XX_BC_DSP_LED3_BITMASK = 0x0008, /**< DSP LED-3 bitmask */ + TA66XX_BC_DSP_LED4_BITMASK = 0x0010, /**< DSP LED-4 bitmask */ + TA66XX_BC_DSP_LED5_BITMASK = 0x0020, /**< DSP LED-5 bitmask */ + TA66XX_BC_DSP_LED6_BITMASK = 0x0040, /**< DSP LED-6 bitmask */ + TA66XX_BC_DSP_LED7_BITMASK = 0x0080, /**< DSP LED-7 bitmask */ + TA66XX_BC_DSP_LEDS_BITMASK = 0x00ff /**< DSP LEDs bitmask */ +}; + +// Definitions for DSP LEDs used for TORNADO-A6678/FMC rev.1A and later boards +/** DSP LED GREEN-0 */ +#define TA66XX_BC_DSP_LED_GREEN0 TA66XX_BC_DSP_LED0 +#define TA66XX_BC_DSP_LED_GREEN0_BITMASK TA66XX_BC_DSP_LED0_BITMASK +/** DSP LED RED-0 */ +#define TA66XX_BC_DSP_LED_RED0 TA66XX_BC_DSP_LED1 +#define TA66XX_BC_DSP_LED_RED0_BITMASK TA66XX_BC_DSP_LED1_BITMASK +/** DSP LED GREEN-1 */ +#define TA66XX_BC_DSP_LED_GREEN1 TA66XX_BC_DSP_LED2 +#define TA66XX_BC_DSP_LED_GREEN1_BITMASK TA66XX_BC_DSP_LED2_BITMASK +/** DSP LED RED-1 */ +#define TA66XX_BC_DSP_LED_RED1 TA66XX_BC_DSP_LED3 +#define TA66XX_BC_DSP_LED_RED1_BITMASK TA66XX_BC_DSP_LED3_BITMASK +/** DSP LED GREEN-2 */ +#define TA66XX_BC_DSP_LED_GREEN2 TA66XX_BC_DSP_LED4 +#define TA66XX_BC_DSP_LED_GREEN2_BITMASK TA66XX_BC_DSP_LED4_BITMASK +/** DSP LED YELLOW-0 */ +#define TA66XX_BC_DSP_LED_YELLOW0 TA66XX_BC_DSP_LED5 +#define TA66XX_BC_DSP_LED_YELLOW0_BITMASK TA66XX_BC_DSP_LED5_BITMASK +/** DSP LED YELLOW-1 */ +#define TA66XX_BC_DSP_LED_YELLOW1 TA66XX_BC_DSP_LED6 +#define TA66XX_BC_DSP_LED_YELLOW1_BITMASK TA66XX_BC_DSP_LED6_BITMASK +/** DSP LED RED-2 */ +#define TA66XX_BC_DSP_LED_RED2 TA66XX_BC_DSP_LED7 +#define TA66XX_BC_DSP_LED_RED2_BITMASK TA66XX_BC_DSP_LED7_BITMASK + +/** DSP LED aliases for compatibility with TORNADO-A6678 rev.1B-1 board definitions */ +#define TA66XX_BC_DSP_LED_RED TA66XX_BC_DSP_LED_RED0 +#define TA66XX_BC_DSP_LED_AMBER TA66XX_BC_DSP_LED_YELLOW0 +#define TA66XX_BC_DSP_LED_BLUE TA66XX_BC_DSP_LED_GREEN2 +#define TA66XX_BC_DSP_LED_WHITE TA66XX_BC_DSP_LED_RED2 + + +// Aliases for DSP LEDs used for TORNADO-A6678 rev.1B-1 board +/** DSP LED GREEN-0 */ +#define TA6678_REV1B_BC_DSP_LED_GREEN0 TA66XX_BC_DSP_LED0 +#define TA6678_REV1B_BC_DSP_LED_GREEN0_BITMASK TA66XX_BC_DSP_LED0_BITMASK +/** DSP LED GREEN-1 */ +#define TA6678_REV1B_BC_DSP_LED_GREEN1 TA66XX_BC_DSP_LED1 +#define TA6678_REV1B_BC_DSP_LED_GREEN1_BITMASK TA66XX_BC_DSP_LED1_BITMASK +/** DSP LED YELLOW-0 */ +#define TA6678_REV1B_BC_DSP_LED_YELLOW0 TA66XX_BC_DSP_LED2 +#define TA6678_REV1B_BC_DSP_LED_YELLOW0_BITMASK TA66XX_BC_DSP_LED2_BITMASK +/** DSP LED YELLOW-1 */ +#define TA6678_REV1B_BC_DSP_LED_YELLOW1 TA66XX_BC_DSP_LED3 +#define TA6678_REV1B_BC_DSP_LED_YELLOW1_BITMASK TA66XX_BC_DSP_LED3_BITMASK +/** DSP LED AMBER */ +#define TA6678_REV1B_BC_DSP_LED_AMBER TA66XX_BC_DSP_LED4 +#define TA6678_REV1B_BC_DSP_LED_AMBER_BITMASK TA66XX_BC_DSP_LED4_BITMASK +/** DSP LED RED */ +#define TA6678_REV1B_BC_DSP_LED_RED TA66XX_BC_DSP_LED5 +#define TA6678_REV1B_BC_DSP_LED_RED_BITMASK TA66XX_BC_DSP_LED5_BITMASK +/** DSP LED BLUE */ +#define TA6678_REV1B_BC_DSP_LED_BLUE TA66XX_BC_DSP_LED6 +#define TA6678_REV1B_BC_DSP_LED_BLUE_BITMASK TA66XX_BC_DSP_LED6_BITMASK +/** DSP LED WHITE */ +#define TA6678_REV1B_BC_DSP_LED_WHITE TA66XX_BC_DSP_LED7 +#define TA6678_REV1B_BC_DSP_LED_WHITE_BITMASK TA66XX_BC_DSP_LED7_BITMASK + + + +/*------------ TA66XX_BC_set_dsp_leds_enable() function ------------------*//** + * @brief Function enables or disables on-board DSP LEDs + * + * @param[in] state - DSP LEDs enable state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_leds_enable(uint32_t enable); + + +/*------------ TA66XX_BC_get_dsp_leds_enable_status() function -----------*//** + * @brief Function returns enable status of on-board DSP LEDs + * + * @return DSP LEDs enable state: TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_leds_enable_status(void); + + +/*------------ TA66XX_BC_set_dsp_led_state() function --------------------*//** + * @brief Function sets selected DSP LED to the desired state: ON or OFF + * + * @param[in] led_number - DSP LED number definition; + * @param[in] state - DSP LED state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_led_state(uint32_t led_number, uint32_t state); + + +/*------------ TA66XX_BC_get_dsp_led_state() function --------------------*//** + * @brief Function returns selected DSP LED state: ON or OFF + * + * @param[in] led_number - DSP LED number definition; + * + * @return DSP LED state: TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_led_state(uint32_t led_number); + + +/*------------ TA66XX_BC_set_dsp_leds() function -------------------------*//** + * @brief Function sets selected DSP LEDs to the desired state: ON or OFF + * + * @param[in] led_bitmask - DSP LEDs (ORed) bitmask; + * @param[in] state - DSP LEDs state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_leds(uint32_t led_bitmask, uint32_t state); + + +/*------------ TA66XX_BC_get_dsp_leds() function -------------------------*//** + * @brief Function returns selected DSP LEDs state: ON or OFF + * + * @param[in] led_bitmask - DSP LEDs (ORed) bitmask; + * + * @return DSP LEDs state + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_leds(uint32_t led_bitmask); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ DSP-to-FPGA GPIO functions ===================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_DSP_FPGA_GPIO TORNADO AMC DSP-to-FPGA GPIO functions + * @{ + */ + +/** DSP-to-FPGA GPIO pins definitions */ +enum TA66XX_BC_DSP_FPGA_GPIO +{ + TA66XX_BC_DSP_FPGA_GPIO0 = 0, /**< DSP-to-FPGA GPIO pin 0 */ + TA66XX_BC_DSP_FPGA_GPIO1, /**< DSP-to-FPGA GPIO pin 1 */ + TA66XX_BC_DSP_FPGA_GPIO2, /**< DSP-to-FPGA GPIO pin 2 */ + TA66XX_BC_DSP_FPGA_GPIO3, /**< DSP-to-FPGA GPIO pin 3 */ + TA66XX_BC_DSP_FPGA_GPIO4, /**< DSP-to-FPGA GPIO pin 4 */ + TA66XX_BC_DSP_FPGA_GPIO5, /**< DSP-to-FPGA GPIO pin 5 */ + TA66XX_BC_DSP_FPGA_GPIO6, /**< DSP-to-FPGA GPIO pin 6 */ + TA66XX_BC_DSP_FPGA_GPIO7 /**< DSP-to-FPGA GPIO pin 7 */ +}; + +/** DSP-to-FPGA GPIO pins bitmask definitions */ +enum TA66XX_BC_DSP_FPGA_GPIO_BITMASKS +{ + TA66XX_BC_DSP_FPGA_GPIO0_BITMASK = 0x0001, /**< DSP-to-FPGA GPIO pin 0 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO1_BITMASK = 0x0002, /**< DSP-to-FPGA GPIO pin 1 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO2_BITMASK = 0x0004, /**< DSP-to-FPGA GPIO pin 2 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO3_BITMASK = 0x0008, /**< DSP-to-FPGA GPIO pin 3 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO4_BITMASK = 0x0010, /**< DSP-to-FPGA GPIO pin 4 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO5_BITMASK = 0x0020, /**< DSP-to-FPGA GPIO pin 5 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO6_BITMASK = 0x0040, /**< DSP-to-FPGA GPIO pin 6 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO7_BITMASK = 0x0080, /**< DSP-to-FPGA GPIO pin 7 bitmask */ + TA66XX_BC_DSP_FPGA_GPIO_BITMASK = 0x00ff /**< DSP-to-FPGA GPIO pins bitmask */ +}; + + +/** DSP-to-FPGA GPIO pins direction definitions */ +#define TA66XX_BC_DSP_FPGA_GPIO_DIR_OUT C66XX_GPIO_DIR_OUT +#define TA66XX_BC_DSP_FPGA_GPIO_DIR_IN C66XX_GPIO_DIR_IN + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_enable() function ----------*//** + * @brief Function enables or disables on-board DSP-to-FPGA GPIO pins + * + * @param[in] state - DSP-to-FPGA GPIO pins enable state: TA66XX_ON or + * TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_enable(uint32_t enable); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_enable_status() function ---*//** + * @brief Function returns enable status of on-board DSP-to-FPGA GPIO pins + * + * @return DSP-to-FPGA GPIO pins enable state: TA66XX_ON or TA66XX_OFF; + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_enable_status(void); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_pin_dir() function ---------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * @param[in] dir - DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_pin_dir(uint32_t pin, uint32_t dir); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_pin_dir() function ---------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * + * @return DSP-to-FPGA GPIO pin direction: IN or OUT + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_pin_dir(uint32_t pin); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_pin_data() function --------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pin to the desired state: ON + * or OFF + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * @param[in] data - DSP-to-FPGA GPIO pin state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_pin_data(uint32_t pin, uint32_t data); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_pin_data() function --------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pin state: ON or OFF + * + * @param[in] pin - DSP-to-FPGA GPIO pin number; + * + * @return DSP-to-FPGA GPIO pin state: TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_pin_data(uint32_t pin); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_dir() function -------------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pins direction: IN or OUT + * + * @param[in] pin_bitmask - DSP-to-FPGA GPIO pins (ORed) bitmask; + * @param[in] dir - DSP-to-FPGA GPIO pin direction: IN or OUT + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_dir(uint32_t pin_bitmask, uint32_t dir); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_dir() function -------------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pins direction: IN or OUT + * + * @param[in] pin - DSP-to-FPGA GPIO pins (ORed) bitmask; + * + * @return DSP-to-FPGA GPIO pins direction: IN or OUT + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_dir(uint32_t pin_bitmask); + + +/*------------ TA66XX_BC_set_dsp_to_fpga_gpio_data() function ------------*//** + * @brief Function sets selected DSP-to-FPGA GPIO pins to the desired state: ON + * or OFF + * + * @param[in] pin_bitmask - DSP-to-FPGA GPIO pins (ORed) bitmask; + * @param[in] data - DSP-to-FPGA GPIO pins state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_dsp_to_fpga_gpio_data(uint32_t pin_bitmask, uint32_t data); + + +/*------------ TA66XX_BC_get_dsp_to_fpga_gpio_data() function ------------*//** + * @brief Function returns selected DSP-to-FPGA GPIO pins state: ON or OFF + * + * @param[in] pin - DSP-to-FPGA GPIO pins (ORed) bitmask; + * + * @return DSP-to-FPGA GPIO pins state + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_dsp_to_fpga_gpio_data(uint32_t pin_bitmask); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ DSP GPIO IRQ functions ========================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_DSP_GPIO_IRQ TORNADO AMC DSP GPIO IRQ mapping functions + * @{ + */ + +/** DSP GPIO pins IRQ source definitions */ +enum TA66XX_BC_DSP_GPIO_IRQ_SEL_SOURCE +{ + TA66XX_BC_DSP_GPIO_IRQ_SEL_OFF = 0, /**< DSP IRQ is disabled */ + TA66XX_BC_DSP_GPIO_IRQ_SEL_MMC_TO_DSP_PD_ALERT, /**< MMC-to-DSP power-down alert is used to generate DSP IRQ */ + TA66XX_BC_DSP_GPIO_IRQ_SEL_MMC_TO_DSP_COMM_RQ, /**< MMC-to-DSP communication request is used to generate DSP IRQ */ + TA66XX_BC_DSP_GPIO_IRQ_SEL_1GE_PHY_IRQ /**< 1GE PHY IRQ is used to generate DSP IRQ */ +}; + +/** DSP GPIO-6 and GPIO-7 pins definitions for TA6678 rev.1B and TA6678/FMC rev.1A boards */ +#define TA66XX_BC_DSP_GPIO6_PIN 6 +#define TA66XX_BC_DSP_GPIO7_PIN 7 +/** DSP GPIO-8 and GPIO-9 pins definitions for TA6678/FMC rev.1B and later boards */ +#define TA66XX_BC_DSP_GPIO8_PIN 8 +#define TA66XX_BC_DSP_GPIO9_PIN 9 + + +/*------------ TA66XX_BC_map_dsp_gpio_interrupt() function ---------------*//** + * @brief Function maps IRQ source to selected DSP GPIO pin + * + * @param[in] gpio_pin - DSP GPIO pin; + * @param[in] irq_src - IRQ source; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_map_dsp_gpio_interrupt(uint32_t gpio_pin, uint32_t irq_src); + + +/*------------ TA66XX_BC_unmap_dsp_gpio_interrupt() function -------------*//** + * @brief Function unmaps IRQ source from selected DSP GPIO pin + * + * @param[in] gpio_pin - DSP GPIO pin; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_unmap_dsp_gpio_interrupt(uint32_t gpio_pin); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ UART functions ================================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_UART TORNADO AMC UART functions + * @{ + */ + +/** DSP UART printf-like string max length */ +#define TA66XX_BC_UART_PRINTF_LEN_MAX 1023 + + +/*------------ TA66XX_BC_init_uart() function ---------------------------*//** + * @brief Function inits the DSP UART peripheral + * + * @param[in] baud_rate - desired baud rate; + * @param[in] data_bits - number of data bits; + * @param[in] parity - parity bit; + * @param[in] stop_bits - number of stop bits; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_init_uart(uint32_t baud_rate, uint32_t data_bits, uint32_t parity, uint32_t stop_bits); + + +/*------------ TA66XX_BC_uart_receiver_is_ready() function ---------------*//** + * @brief Function checks if a character is received over DSP UART + * + * @return 1 - a character is received over DSP UART, + * 0 - otherwise + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_receiver_is_ready() C66XX_UART_receiver_is_ready() + + +/*------------ TA66XX_BC_uart_receive_char() function --------------------*//** + * @brief Function receives a character over DSP UART + * + * @return Received character + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_receive_char() C66XX_UART_receive_char() + + +/*------------ TA66XX_BC_uart_transmit_char() function -------------------*//** + * @brief Function transmits a character over DSP UART + * + * @param[in] c - A character to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_transmit_char(c) C66XX_UART_transmit_char(c) + + +/*------------ TA66XX_BC_uart_transmit_string() function -----------------*//** + * @brief Function transmits a string until '0' charachter + * + * @param[in] s - A pointer to the string to transmit + * + * @return None + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_transmit_string(s) C66XX_UART_transmit_string(s) + + +/*------------ TA66XX_BC_uart_receive_line_string() function -------------*//** + * @brief Function receives a line ended with CR character, and stores + * received characters into string with '\0' symbol. + * + * @param[in] s - Pointer to a string to store received characters + * + * @return Number of received characters without '\0' symbol. + * +-----------------------------------------------------------------------------*/ +#define TA66XX_BC_uart_receive_line_string(s) C66XX_UART_receive_line_string(s) + + +/*------------ TA66XX_BC_uart_printf() function --------------------------*//** + * @brief Function prints messages to UART + * + * @param[in] format - format string; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_uart_printf(const char *format, ...); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ EEPROM functions =============================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_EEPROM TORNADO AMC EEPROM memory functions + * @{ + */ + +/*------------ TA66XX_BC_get_eeprom_length() function --------------------*//** + * @brief Function returns on-board EEPROM memory length in bytes + * + * @return On-board EEPROM memory length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_eeprom_length(void); + + +/*------------ TA66XX_BC_write_eeprom() function -------------------------*//** + * @brief Function writes data[len] to EEPROM memory starting at memory + * address addr + * + * @param[in] addr - memory address within the chip; + * @param[in] data - pointer to data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_eeprom(uint32_t addr, uint8_t *data, uint32_t len); + + +/*------------ TA66XX_BC_read_eeprom() function --------------------------*//** + * @brief Function reads data[len] from EEPROM memory starting at memory + * address addr + * + * @param[in] addr - memory address within the chip; + * @param[out] buf - pointer to data buffer to store data; + * @param[in] len - data len in bytes; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_read_eeprom(uint32_t addr, uint8_t *buf, uint32_t len); + + +/*------------ TA66XX_BC_erase_eeprom() function -------------------------*//** + * @brief Function erases len bytes from EEPROM memory starting at memory + * address addr + * + * @param[in] addr - memory address within the chip; + * @param[in] len - number of bytes to erase; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_erase_eeprom(uint32_t addr, uint32_t len); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Board info functions =========================================== +//============================================================================= + +/** @addtogroup TA66XX_BC_BOARD_INFO TORNADO AMC board info functions + * @{ + */ + + +/** Board info data descriptor IDs */ +#define TA66XX_BC_BOARD_INFO_ID_TA6678_REV1B 1 +#define TA66XX_BC_BOARD_INFO_ID_TA6678FMC_REV1A 2 +#define TA66XX_BC_BOARD_INFO_ID_TA6678FMC_REV1B 3 + + +/** Board temperature data descriptor */ +typedef struct +{ + float temp_pcb, /**< PCB current temperature */ + temp_dsp, /**< DSP current temperature */ + temp_fpga; /**< FPGA current temperature */ + + // TEMP zone classification status + // This var is set according to TA6678_MC_TEMP_ZONE_ID_xxxx defs. + uint32_t temp_zone_id; /**< Temperature zone ID */ + + // 8-bit integer thresholds for MMC TEMP zones + // These thresholds are used to classify summary temparature, which MMC derives + // from PCB, DSP and FPGA temperatures. + char overheated_low_zone_threshold, /**< OVERHEATED low threshold (P/S will be switched OFF at this threshold and upper) */ + hot_low_zone_threshold, /**< HOT low threshold (P/S will be not switched ON at this threshold and upper) */ + warm3_low_zone_threshold, /**< WARM3 low threshold */ + warm2_low_zone_threshold, /**< WARM2 low threshold */ + warm1_low_zone_threshold, /**< WARM1 low threshold */ + normal_low_zone_threshold, /**< NORMAL low threshold */ + cold1_low_zone_threshold, /**< COLD1 low threshold */ + cold2_low_zone_threshold, /**< COLD2 low threshold */ + cold3_low_zone_threshold, /**< COLD3 low threshold (P/S will be not switched ON below this threshold) */ + frosty_low_zone_threshold; /**< FROSTY low threshold (P/S will be switched OFF below this threshold) */ + + // 8-bit integer thresholds for AMC TEMP zones for every on-board temp sensor + char amc_pcb_temp_noncritical_threshold, /**< PCB temperature AMC UPPER NON-CRITICAL ASSERTING EVENT threshold */ + amc_pcb_temp_critical_threshold, /**< PCB temperature AMC UPPER CRITICAL ASSERTING EVENT threshold */ + amc_pcb_temp_nonrecoverable_threshold, /**< PCB temperature AMC UPPER NON-RECOVERABLE ASSERTING EVENT threshold */ + amc_pcb_temp_hysteresis, /**< PCB temperature AMC positive going hysteresis */ + + amc_dsp_temp_noncritical_threshold, /**< DSP temperature AMC UPPER NON-CRITICAL ASSERTING EVENT threshold */ + amc_dsp_temp_critical_threshold, /**< DSP temperature AMC UPPER CRITICAL ASSERTING EVENT threshold */ + amc_dsp_temp_nonrecoverable_threshold, /**< DSP temperature AMC UPPER NON-RECOVERABLE ASSERTING EVENT threshold */ + amc_dsp_temp_hysteresis, /**< DSP temperature AMC positive going hysteresis */ + + amc_fpga_temp_noncritical_threshold, /**< FPGA temperature AMC UPPER NON-CRITICAL ASSERTING EVENT threshold */ + amc_fpga_temp_critical_threshold, /**< FPGA temperature AMC UPPER CRITICAL ASSERTING EVENT threshold */ + amc_fpga_temp_nonrecoverable_threshold, /**< FPGA temperature AMC UPPER NON-RECOVERABLE ASSERTING EVENT threshold */ + amc_fpga_temp_hysteresis; /**< FPGA temperature AMC positive going hysteresis */ + +} TA66XX_BC_TEMP_DATA_DD; +// Board temperature data descriptor length +#define TA66XX_BC_TEMP_DATA_DD_LEN sizeof(TA66XX_BC_TEMP_DATA_DD) + + +/** Board current power data descriptor for TA6678 rev.1B-1 board */ +typedef struct +{ + float v_12v, /**< Input +12V power supply voltage value */ + i_12v, /**< Input +12V power supply current value */ + v_3v3_aux, /**< On-board auxiliary +3.3V power supply voltage value */ + i_3v3_aux, /**< On-board auxiliary +3.3V power supply current value */ + v_mc, /**< Module management power supply voltage value */ + i_mc, /**< Module management power supply current value */ + v_3v3, /**< On-board +3.3V power supply voltage value */ + i_3v3, /**< On-board +3.3V power supply current value */ + v_2v5, /**< On-board +2.5V power supply voltage value */ + i_2v5, /**< On-board +2.5V power supply current value */ + v_1v8, /**< On-board +1.8V power supply voltage value */ + i_1v8, /**< On-board +1.8V power supply current value */ + v_1v5, /**< On-board +1.5V power supply voltage value */ + i_1v5, /**< On-board +1.5V power supply current value */ + v_1v0, /**< On-board +1.0V power supply voltage value */ + i_1v0, /**< On-board +1.0V power supply current value */ + v_ddr_vtt, /**< On-board DDR3 VTT power supply voltage value */ + v_dsp_vcore, /**< On-board DSP core power supply voltage value */ + i_dsp_vcore, /**< On-board DSP core power supply current value */ + v_fpga_vcore, /**< On-board FPGA core power supply voltage value */ + i_fpga_vcore, /**< On-board FPGA core power supply current value */ + v_fpga_mgtavcc, /**< On-board FPGA MGTAVCC power supply voltage value */ + v_fpga_mgtavtt; /**< On-board FPGA MGTAVTT power supply voltage value */ + +} TA6678_REV1B_BC_POWER_DATA_DD; +// Board current power data descriptor for TA6678 rev.1B-1 board length +#define TA6678_REV1B_BC_POWER_DATA_DD_LEN sizeof(TA6678_REV1B_BC_POWER_DATA_DD) + + +/** Board current power data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + float power_12v, /**< Input +12V power supply value */ + power_fpga_core, /**< On-board FPGA core power supply value */ + power_dsp_core, /**< On-board DSP core power supply value */ + v_12v, /**< Input +12V power supply voltage value */ + i_12v, /**< Input +12V power supply current value */ + i_fpga_core, /**< On-board FPGA core power supply current value */ + i_dsp_core; /**< On-board DSP core power supply current value */ + +} TA66XX_BC_PRIMARY_POWER_DATA_DD; +// Board current power data descriptor length +#define TA66XX_BC_PRIMARY_POWER_DATA_DD_LEN sizeof(TA66XX_BC_PRIMARY_POWER_DATA_DD) + + +/** Board current power data union */ +typedef union +{ + TA6678_REV1B_BC_POWER_DATA_DD ta6678_rev1b_dd; + TA66XX_BC_PRIMARY_POWER_DATA_DD primary_power_dd; +} POWER_DATA_DD; + + +/** Board current power data descriptor */ +typedef struct +{ + unsigned id; // ID to decode the UNION structure type + POWER_DATA_DD power_data_dd; + +} TA66XX_BC_POWER_DATA_DD; +// Board current power data descriptor length +#define TA66XX_BC_POWER_DATA_DD_LEN sizeof(TA66XX_BC_POWER_DATA_DD) + + +/** FMC interface power data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + float power_fmc_12v, /**< FMC I/F +12V power supply value */ + power_fmc_3v3, /**< FMC I/F +3.3V power supply value */ + power_fmc_vadj, /**< FMC I/F Vadj power supply value */ + v_fmc_12v, /**< FMC I/F +12V power supply voltage value */ + i_fmc_12v, /**< FMC I/F +12V power supply current value */ + v_fmc_3v3, /**< FMC I/F +3.3V power supply voltage value */ + i_fmc_3v3, /**< FMC I/F +3.3V power supply current value */ + v_fmc_vadj, /**< FMC I/F Vadj power supply voltage value */ + i_fmc_vadj, /**< FMC I/F Vadj power supply current value */ + v_fmc_vio_b_m2c, /**< FMC I/F VIO_B_M2C power supply voltage value */ + v_fmc_vref_a_m2c, /**< FMC I/F VREF_A_M2C power supply voltage value */ + v_fmc_vref_b_m2c; /**< FMC I/F VREF_B_M2C power supply voltage value */ + +} TA66XX_BC_FMC_POWER_DATA_DD; +// FMC interface power data descriptor length +#define TA66XX_BC_FMC_POWER_DATA_DD_LEN sizeof(TA66XX_BC_FMC_POWER_DATA_DD) + + +/** Max string length in device info structure */ +#define TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX 32 +#define TA66XX_BC_DEVICE_PN_STRING_LEN_MAX 64 +#define TA66XX_BC_DEVICE_HW_REVISION_STRING_LEN_MAX 16 + + +/** Board info data descriptor for TA6678 rev.1B-1 board */ +typedef struct +{ + uint32_t op_mode; /**< Operation mode: '0' - stand-alone mode, '1' - AMC host mode */ + uint32_t amc_slot_id; /**< AMC slot ID (in case AMC host mode is used) */ + uint8_t manufacturing_date_day_of_month; /**< Manufacturing day: 1..31 */ + uint8_t manufacturing_date_month; /**< Manufacturing month: 1..12 ('1' - January) */ + uint16_t manufacturing_date_year; /**< Manufacturing year: 2015.. */ + char device_sn[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Device serial number */ + char mmc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC firmware revision string */ + char tammc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< TAMMC firmware revision string */ + char mmc_core_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC core firmware revision string */ +} TA6678_REV1B_BC_DEVICE_INFO_DATA_DD; +// Board info data descriptor for TA6678 rev.1B-1 board length +#define TA6678_REV1B_BC_DEVICE_INFO_DATA_DD_LEN sizeof(TA6678_REV1B_BC_DEVICE_INFO_DATA_DD) + + +/** Board info data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + uint32_t op_mode; /**< Operation mode: '0' - stand-alone mode, '1' - AMC host mode */ + uint32_t amc_slot_id; /**< AMC slot ID (in case AMC host mode is used) */ + uint8_t manufacturing_date_day_of_month; /**< Manufacturing day: 1..31 */ + uint8_t manufacturing_date_month; /**< Manufacturing month: 1..12 ('1' - January) */ + uint16_t manufacturing_date_year; /**< Manufacturing year: 2015.. */ + char manufacturer_name[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Manufacturer name */ + char device_name[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Device name */ + char device_pn[TA66XX_BC_DEVICE_PN_STRING_LEN_MAX]; /**< Device part number */ + char device_sn[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< Device serial number */ + char device_hw_revision[TA66XX_BC_DEVICE_HW_REVISION_STRING_LEN_MAX]; /**< Device H/W revision */ + char mmc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC firmware revision string */ + char tammc_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< TAMMC firmware revision string */ + char mmc_core_fw_rev[TA66XX_BC_DEVICE_INFO_STRING_LEN_MAX]; /**< MMC core firmware revision string */ +} TA66XX_BC_FULL_DEVICE_INFO_DATA_DD; +// Board info data descriptor length +#define TA66XX_BC_FULL_DEVICE_INFO_DATA_DD_LEN sizeof(TA66XX_BC_FULL_DEVICE_INFO_DATA_DD) + + +/** Board current power data union */ +typedef union +{ + TA6678_REV1B_BC_DEVICE_INFO_DATA_DD ta6678_rev1b_dd; + TA66XX_BC_FULL_DEVICE_INFO_DATA_DD ta66xx_full_device_info_dd; +} DEVICE_INFO_DATA_DD; + + +/** Board current power data descriptor */ +typedef struct +{ + uint32_t id; // ID to decode the UNION structure type + DEVICE_INFO_DATA_DD device_info_data_dd; + +} TA66XX_BC_DEVICE_INFO_DATA_DD; +// Board current power data descriptor length +#define TA66XX_BC_DEVICE_INFO_DATA_DD_LEN sizeof(TA66XX_BC_DEVICE_INFO_DATA_DD) + + +/** Hardware configuration info data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + uint32_t fpga_ddr0_len; /**< FPGA DDR memory bank #0 length in MB: 0 - not installed */ + uint32_t fpga_ddr1_len; /**< FPGA DDR memory bank #1 length in MB: 0 - not installed */ + uint32_t cpu_ddr_len; /**< CPU DDR memory length in MB: 0 - not installed */ + uint32_t flash_len; /**< FLASH memory length in MB: 0 - not installed */ + uint32_t mram_len; /**< MRAM memory length in KB: 0 - not installed */ + uint32_t i2c_eeprom_len; /**< I2C EEPROM memory length in KB: 0 - not installed */ + uint32_t cpu_clk_freq_id; /**< CPU input clock frequency in MHz: 0 - not available */ + uint32_t x1ge0_phy_installed_id; /**< External 1GE PHY #0 installed ID: 0 - not installed */ + uint32_t x1ge1_phy_installed_id; /**< External 1GE PHY #1 installed ID: 0 - not installed */ + uint32_t sfp0_if_installed_id; /**< SFP interface #0 installed ID: 0 - not installed */ + uint32_t sfp1_if_installed_id; /**< SFP interface #1 installed ID: 0 - not installed */ + uint32_t qsfp_if_installed_id; /**< QSFP interface installed ID: 0 - not installed */ + uint32_t fmc_if_installed_id; /**< FMC interface installed ID: 0 - not installed */ + uint32_t sd_slot_installed_id; /**< uSD slot installed ID: 0 - not installed */ +} TA66XX_BC_HW_CFG_INFO_DATA_DD; +// Hardware configuration info data descriptor length +#define TA66XX_BC_HW_CFG_INFO_DATA_DD_LEN sizeof(TA66XX_BC_HW_CFG_INFO_DATA_DD) + + +/** Max string length in FMC info structure */ +#define TA66XX_BC_FMC_STATUS_STRING_LEN_MAX 48 +#define TA66XX_BC_FMC_INFO_STRING_LEN_MAX 64 +#define TA66XX_BC_MANUFACTURING_TIME_STRING_LEN_MAX 32 + + +/** FMC info data descriptor for TA6678/FMC rev.1A and later boards */ +typedef struct +{ + char fmc_status_text[TA66XX_BC_FMC_STATUS_STRING_LEN_MAX]; /**< FMC status */ + char manufacturer_name[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Manufacturer name */ + char device_name[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device name */ + char device_pn[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device part number */ + char device_sn[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device serial number */ + char device_version[TA66XX_BC_FMC_INFO_STRING_LEN_MAX]; /**< Device version */ + char manufacturing_time[TA66XX_BC_MANUFACTURING_TIME_STRING_LEN_MAX]; /**< Manufacturing time */ +} TA66XX_BC_FMC_INFO_DATA_DD; +// FMC info data descriptor length +#define TA66XX_BC_FMC_INFO_DATA_DD_LEN sizeof(TA66XX_BC_FMC_INFO_DATA_DD) + + + +/*------------ TA66XX_BC_get_device_info() function ----------------------*//** + * @brief Function returns AMC module device info: operation mode, serial + * number, manufacturing date, firmware revisions + * + * @param[out] info_dd - pointer to a buffer that receives device info data + * descriptor in case function is completed without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_device_info(TA66XX_BC_DEVICE_INFO_DATA_DD *info_dd); + + +/*------------ TA66XX_BC_get_hw_cfg_info() function ----------------------*//** + * @brief Function returns AMC module hardware configuration info: installed + * memories, interfaces, etc. + * + * @param[out] info_dd - pointer to a buffer that receives hardware + * configuration data descriptor in case function is completed + * without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_hw_cfg_info(TA66XX_BC_HW_CFG_INFO_DATA_DD *info_dd); + + +/*------------ TA66XX_BC_get_fmc_info() function -------------------------*//** + * @brief Function returns FMC module device info: installed status, device + * name, serial number, manufacturing date, firmware revisions, etc. + * + * @param[out] info_dd - pointer to a buffer that receives FMC info data + * descriptor in case function is completed without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fmc_info(TA66XX_BC_FMC_INFO_DATA_DD *info_dd); + + +/*------------ TA66XX_BC_get_temp_state() function -----------------------*//** + * @brief Function returns AMC module temperature monitor current info + * + * @param[out] temp_data_dd - pointer to a buffer that receives board + * temperature data descriptor in case function is completed + * without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_temp_state(TA66XX_BC_TEMP_DATA_DD *temp_data_dd); + + +/*------------ TA66XX_BC_get_power_state() function ----------------------*//** + * @brief Function returns AMC module power monitor current info + * + * @param[out] power_data_dd - pointer to a buffer that receives board power + * data descriptor in case function is completed without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_power_state(TA66XX_BC_POWER_DATA_DD *power_data_dd); + + +/*------------ TA66XX_BC_get_fmc_power_state() function ------------------*//** + * @brief Function returns FMC module power monitor current info + * + * @param[out] fmc_power_data_dd - pointer to a buffer that receives FMC + * module power data descriptor in case function is completed + * without errors. + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fmc_power_state(TA66XX_BC_FMC_POWER_DATA_DD *fmc_power_data_dd); + + +/*------------ TA66XX_BC_set_mmc_to_dsp_rq() function --------------------*//** + * @brief Function sets MMC-to-DSP request from DSP (for test purposes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_mmc_to_dsp_rq(void); + + +/*------------ TA66XX_BC_set_mmc_power_down_notification() function ------*//** + * @brief Function sets MMC-to-DSP power down notification from DSP + * (for test purposes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_mmc_power_down_notification(void); + + +/*------------ TA66XX_BC_get_sfp_info() function -------------------------*//** + * @brief Function returns identification info about installed SFP + * transceiver: 256-byte array read from address 0x50 (identification info + * according to SFF-8472) and 256-byte array read from address 0x51 (digital + * diagnostic monitoring interface (DDMI) data) + * + * @param[out] id_data - pointer to a buffer that receives 256-byte array read + * from address 0x50 (identification info according to SFF-8472). + * In case pointer is NULL, then no data are filled in; + * @param[out] ddmi_data - pointer to a buffer that receives 256-byte array + * read from address 0x51 (DDMI data). In case pointer is NULL, + * then no data are filled in; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_sfp_info(uint8_t *id_data, uint8_t *ddmi_data); + + +/** @}*/ + +//============================================================================= + + + +//============================================================================= +//============ FPGA functions ================================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_FPGA TORNADO AMC FPGA functions + * @{ + */ + +/** FPGA host interface (HIF) configuration data descriptor */ +typedef struct +{ + uint32_t w_setup; /**< Write strobe setup EMIF-16 cycles */ + uint32_t w_strobe; /**< Write strobe duration EMIF-16 cycles */ + uint32_t w_hold; /**< Write strobe hold EMIF-16 cycles */ + uint32_t r_setup; /**< Read strobe setup EMIF-16 cycles */ + uint32_t r_strobe; /**< Read strobe duration EMIF-16 cycles */ + uint32_t r_hold; /**< Read strobe hold EMIF-16 cycles */ + uint32_t turn_around; /**< Turn around EMIF-16 cycles */ +} TA66XX_BC_FPGA_HIF_CNF_DD; +// FPGA HIF configuration data descriptor length in bytes +#define TA66XX_BC_FPGA_HIF_CNF_DD_LEN sizeof(TA66XX_BC_FPGA_HIF_CNF_DD) + + +/*------------ TA66XX_BC_set_fpga_hif_cnf() function ---------------------*//** + * @brief Function sets new configuration to FPGA host interface according to + * supplied parameters + * + * @param[in] cfg_dd - pointer to new FPGA HIF configuration data descriptor; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_set_fpga_hif_cnf(TA66XX_BC_FPGA_HIF_CNF_DD *cfg_dd); + + +/*------------ TA66XX_BC_get_fpga_hif_cnf() function ---------------------*//** + * @brief Function returns current configuration of FPGA host interface + * + * @param[in] cfg_dd - pointer to buffer to receive current FPGA HIF + * configuration data descriptor; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fpga_hif_cnf(TA66XX_BC_FPGA_HIF_CNF_DD *cfg_dd); + + +/*------------ TA66XX_BC_get_fpga_hif_base_addr() function ---------------*//** + * @brief Function returns FPGA host interface base address + * + * @return FPGA host interface base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_fpga_hif_base_addr(void); + + +/*------------ TA66XX_BC_get_fpga_hif_length() function ------------------*//** + * @brief Function returns FPGA host interface length in bytes + * + * @return FPGA host interface length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_fpga_hif_length(void); + + +/*------------ TA66XX_BC_set_fpga_hif_reset() function -------------------*//** + * @brief Function sets or releases FPGA host interface reset + * + * @param[in] state - FPGA host interface reset state: ON or OFF + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_fpga_hif_reset(uint32_t state); + + +/*------------ TA66XX_BC_get_fpga_hif_reset_state() function -------------*//** + * @brief Function returns FPGA host interface reset state + * + * @return FPGA host interface reset state: ON or OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_fpga_hif_reset_state(void); + + +/*------------ TA66XX_BC_read_fpga_hif_byte() function -------------------*//** + * @brief Function reads a byte from FPGA host interface at address addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A byte read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint8_t TA66XX_BC_read_fpga_hif_byte(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_byte() function ------------------*//** + * @brief Function writes a byte to FPGA host interface at address addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A byte to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_byte(uint32_t addr, uint8_t v); + + +/*------------ TA66XX_BC_read_fpga_hif_w16() function --------------------*//** + * @brief Function reads a 16-bit word from FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A 16-bit word read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint16_t TA66XX_BC_read_fpga_hif_w16(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_w16() function -------------------*//** + * @brief Function writes a 16-bit word to FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A 16-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_w16(uint32_t addr, uint16_t v); + + +/*------------ TA66XX_BC_read_fpga_hif_w32() function --------------------*//** + * @brief Function reads a 32-bit word from FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A 32-bit word read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_read_fpga_hif_w32(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_w32() function -------------------*//** + * @brief Function writes a 32-bit word to FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A 32-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_w32(uint32_t addr, uint32_t v); + + +/*------------ TA66XX_BC_read_fpga_hif_w64() function --------------------*//** + * @brief Function reads a 64-bit word from FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to read from + * + * @return A 64-bit word read from FPGA host interface + * +-----------------------------------------------------------------------------*/ +uint64_t TA66XX_BC_read_fpga_hif_w64(uint32_t addr); + + +/*------------ TA66XX_BC_write_fpga_hif_w64() function -------------------*//** + * @brief Function writes a 64-bit word to FPGA host interface at address + * addr. + * + * @param[in] addr - FPGA address to write to + * @param[in] v - A 64-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_fpga_hif_w64(uint32_t addr, uint64_t v); + + +/*------------ TA66XX_BC_clear_fpga_cnf() function -----------------------*//** + * @brief Function clears FPGA configuration memory + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_clear_fpga_cnf(void); + + +/*------------ TA66XX_BC_load_fpga_cnf() function ------------------------*//** + * @brief Function loads FPGA firmware file using the supported configuration + * interfaces (serial or parallel) + * + * @param[in] addr - address where FPGA firmware file data were saved; + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_load_fpga_cnf(uint32_t addr); + + +/*------------ TA66XX_BC_get_fpga_cnf_status() function ------------------*//** + * @brief Function returns FPGA configuration memory status: either + * loaded by FPGA firmware file or not + * + * @return TA66XX_OK - FPGA configuration memory is loaded, + * TA66XX_FPGA_CNF_LOAD_ERR - FPGA configuration memory is cleared. + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_fpga_cnf_status(void); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ FLASH functions ================================================ +//============================================================================= + +/** @addtogroup TA66XX_BC_FLASH TORNADO AMC FLASH API functions + * @{ + */ + + +/** FLASH memory sector is protected for write/erase operations */ +#define TA66XX_BC_FLASH_SECTOR_PROTECTED 1 +/** FLASH memory sector is unprotected for write/erase operations */ +#define TA66XX_BC_FLASH_SECTOR_UNPROTECTED 0 + + +/*------------ TA66XX_BC_get_flash_area_base_addr() function -------------*//** + * @brief Function returns FLASH area base address + * + * @return FLASH area base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_area_base_addr(void); + + +/*------------ TA66XX_BC_get_flash_length() function ---------------------*//** + * @brief Function returns on-board FLASH memory length in bytes + * + * @return On-board FLASH memory length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_length(void); + + +/*------------ TA66XX_BC_get_flash_hw_wp_enable_status() function --------*//** + * @brief Function returns enable status of on-board FLASH memory hardware + * (via on-board switch) write-protection + * + * @return On-board FLASH memory hardware write-protection enable state: + * TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_hw_wp_enable_status(void); + + +/*------------ TA66XX_BC_get_flash_sw_wp_enable_status() function --------*//** + * @brief Function returns enable status of on-board FLASH memory software + * write-protection + * + * @return On-board FLASH memory software write-protection enable state: + * TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_flash_sw_wp_enable_status(void); + + +/*------------ TA66XX_BC_set_flash_sw_wp_enable() function ---------------*//** + * @brief Function enables or disables on-board FLASH memory software + * write-protection + * + * @param[in] enable - on-board FLASH memory software write-protection enable + * state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_flash_sw_wp_enable(uint32_t enable); + + +/*------------ TA66XX_BC_erase_flash() function --------------------------*//** + * @brief Function erases FLASH block, which starts from address a + * and of size len (in bytes) + * + * @param[in] addr - Block start address (in bytes) + * @param[in] len - block length (in bytes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_erase_flash(uint32_t addr, uint32_t len); + + +/** Flag to disable FLASH memory erasing before write operation */ +#define TA66XX_BC_FLASH_ERASE_IS_DISABLED 0 +/** Flag to enable FLASH memory erasing before write operation */ +#define TA66XX_BC_FLASH_ERASE_IS_ENABLED 1 + + +/*------------ TA66XX_BC_write_flash() function --------------------------*//** + * @brief Function writes data block of size len to FLASH address a + * The function erases FLASH before writing data to FLASH if erase input + * parameter is set. + * + * @param[in] a - FLASH address (in bytes) + * @param[in] ptr - data block to write + * @param[in] len - data block length (in bytes) + * @param[in] erase - flag to enable FLASH erasing before write operation + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash(uint32_t a, void *ptr, uint32_t len, uint32_t erase); + + +/*------------ TA66XX_BC_write_flash_byte() function ---------------------*//** + * @brief Function writes data byte d to FLASH address a + * + * @param[in] a - FLASH address (in bytes) + * @param[in] d - data byte to write + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash_byte(uint32_t addr, uint8_t d); + + +/*------------ TA66XX_BC_write_flash_w16() function ----------------------*//** + * @brief Function writes 16-bit data word d to FLASH address a + * + * @param[in] addr - FLASH address (in bytes) + * @param[in] d - 16-bit data word to write + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash_w16(uint32_t addr, uint16_t d); + + +/*------------ TA66XX_BC_write_flash_w32() function ----------------------*//** + * @brief Function writes 32-bit data word d to FLASH address a + * + * @param[in] addr - FLASH address (in bytes) + * @param[in] d - 32-bit data word to write + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_write_flash_w32(uint32_t addr, uint32_t d); + + +/*------------ TA66XX_BC_read_flash() function ---------------------------*//** + * @brief Function reads data block of size len from FLASH address a + * + * @param[in] addr - FLASH address (in bytes) + * @param[in] ptr - pointer to data buffer to store data block + * @param[in] len - data block length (in bytes) + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_read_flash(uint32_t addr, void *ptr, uint32_t len); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ MRAM functions ================================================= +//============================================================================= + +/** @addtogroup TA66XX_BC_MRAM TORNADO AMC MRAM API functions + * @{ + */ + + +/*------------ TA66XX_BC_get_mram_area_base_addr() function --------------*//** + * @brief Function returns MRAM area base address + * + * @return MRAM area base address + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_mram_area_base_addr(void); + + +/*------------ TA66XX_BC_get_mram_length() function ----------------------*//** + * @brief Function returns on-board MRAM memory length in bytes + * + * @return On-board MRAM memory length in bytes + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_mram_length(void); + + +/*------------ TA66XX_BC_get_mram_sw_wp_enable_status() function ---------*//** + * @brief Function returns enable status of on-board MRAM memory software + * write-protection + * + * @return On-board MRAM memory software write-protection enable state: + * TA66XX_ON or TA66XX_OFF + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_get_mram_sw_wp_enable_status(void); + + +/*------------ TA66XX_BC_set_mram_sw_wp_enable() function ----------------*//** + * @brief Function enables or disables on-board MRAM memory software + * write-protection + * + * @param[in] enable - on-board MRAM memory software write-protection enable + * state: TA66XX_ON or TA66XX_OFF; + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_set_mram_sw_wp_enable(uint32_t enable); + + +/*------------ TA66XX_BC_read_mram_byte() function -----------------------*//** + * @brief Function reads a byte from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A byte read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint8_t TA66XX_BC_read_mram_byte(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_byte() function ----------------------*//** + * @brief Function writes a byte to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A byte to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_byte(uint32_t addr, uint8_t v); + + +/*------------ TA66XX_BC_read_mram_w16() function ------------------------*//** + * @brief Function reads a 16-bit word from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A 16-bit word read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint16_t TA66XX_BC_read_mram_w16(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_w16() function -----------------------*//** + * @brief Function writes a 16-bit word to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A 16-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_w16(uint32_t addr, uint16_t v); + + +/*------------ TA66XX_BC_read_mram_w32() function ------------------------*//** + * @brief Function reads a 32-bit word from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A 32-bit word read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint32_t TA66XX_BC_read_mram_w32(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_w32() function -----------------------*//** + * @brief Function writes a 32-bit word to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A 32-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_w32(uint32_t addr, uint32_t v); + + +/*------------ TA66XX_BC_read_mram_w64() function ------------------------*//** + * @brief Function reads a 64-bit word from MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to read from + * + * @return A 64-bit word read from MRAM memory + * +-----------------------------------------------------------------------------*/ +uint64_t TA66XX_BC_read_mram_w64(uint32_t addr); + + +/*------------ TA66XX_BC_write_mram_w64() function -----------------------*//** + * @brief Function writes a 64-bit word to MRAM memory at address addr. + * + * @param[in] addr - MRAM memory address to write to + * @param[in] v - A 64-bit word to write + * + * @return None + * +-----------------------------------------------------------------------------*/ +void TA66XX_BC_write_mram_w64(uint32_t addr, uint64_t v); + + +/** @}*/ +//============================================================================= + + + +//============================================================================= +//============ Gigabit Ethernet (GbE) Switch functions ======================== +//============================================================================= + +/** @addtogroup TA66XX_BC_GBE TORNADO AMC Gigabit Ethernet Switch functions + * @{ + */ + +/** Gigabit Ethernet ports count available at the board */ +#define TA66XX_BC_GBE_PORT_COUNT 2 + +/** DSP SGMII port number which is routed to AMC connector */ +#define TA66XX_BC_GBE_PORT_AMC_PORT_NUMBER 0 +/** Alias for DSP SGMII port-0 number */ +#define TA66XX_BC_GBE_PORT_AMC0_PORT_NUMBER TA66XX_BC_GBE_PORT_AMC_PORT_NUMBER +/** DSP SGMII port number which is routed to external PHY */ +#define TA66XX_BC_GBE_PORT_X1GE_PORT_NUMBER 1 +/** Alias for DSP SGMII port-1 number */ +#define TA66XX_BC_GBE_PORT_AMC1_PORT_NUMBER TA66XX_BC_GBE_PORT_X1GE_PORT_NUMBER + + +/** Gigabit Ethernet port type */ +typedef enum +{ + TA66XX_BC_GBE_PORT_TYPE_NONE = 0, /**< Gigabit Ethernet port is not used */ + TA66XX_BC_GBE_PORT_TYPE_PHY, /**< Gigabit Ethernet port is connected to on-board PHY */ + TA66XX_BC_GBE_PORT_TYPE_AMC, /**< Gigabit Ethernet port is connected to the backplane AMC chassis */ + TA66XX_BC_GBE_PORT_TYPE_MAX /**< End of port type */ +} TA66XX_BC_GBE_PORT_TYPE; + + +/** Gigabit Ethernet port link status */ +typedef enum +{ + TA66XX_BC_GBE_PORT_LINK_STATUS_DOWN = 0, /**< Gigabit Ethernet port link is down */ + TA66XX_BC_GBE_PORT_LINK_STATUS_UP, /**< Gigabit Ethernet port link is up */ + TA66XX_BC_GBE_PORT_LINK_STATUS_MAX /**< End of link status */ +} TA66XX_BC_GBE_PORT_LINK_STATUS; + + +/** T-AMC Gigabit Ethernet port data descriptor */ +typedef struct +{ + uint32_t number; /**< Port number */ + TA66XX_BC_GBE_PORT_TYPE type; /**< Gigabit Ethernet port type */ + TA66XX_BC_GBE_PORT_LINK_STATUS link_status; /**< Gigabit Ethernet port link status */ + uint8_t mac_address[6]; /**< MAC (physical) address of the port */ +} TA66XX_BC_GBE_PORT_DD; +// T-AMC Gigabit Ethernet port data descriptor length in bytes +#define TA66XX_BC_GBE_PORT_DD_LEN sizeof(TA66XX_BC_GBE_PORT_DD) + + +/** IP address string max size in bytes*/ +#define TA66XX_BC_IP_ADDRESS_LEN_MAX 16 +/** Host name max size in bytes*/ +#define TA66XX_BC_HOSTNAME_LEN_MAX 256 + + +/** Static IP configuration */ +#define TA66XX_BC_IP_CFG_TYPE_STATIC 0 +/** Dynamic (DHCP) IP configuration */ +#define TA66XX_BC_IP_CFG_TYPE_DYNAMIC 1 + + +/*------------ TA66XX_BC_init_gbe_port() function ------------------------*//** + * @brief Function initializes selected DSP Gigabit Ethernet port + * + * @param[in] port - DSP Gigabit Ethernet port number + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_init_gbe_port(uint32_t port); + + +/*------------ TA66XX_BC_get_gbe_port_info() function --------------------*//** + * @brief Function returns Gigabit Ethernet port info: port mode, MAC address, + * link status + * + * @param[in] port - Gigabit Ethernet port number for which port info should + * be returned + * @param[out] port_dd - pointer to a buffer to which Gigabit Ethernet port + * data descriptor should be returned + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t TA66XX_BC_get_gbe_port_info(uint32_t port, TA66XX_BC_GBE_PORT_DD *port_dd); + + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __TA66XX_BC_DSP_BC_FUNCTIONS_HXX__ */ diff --git a/ports/c667x/ccs/example_build/include/TA66XX_OSAL.h b/ports/c667x/ccs/example_build/include/TA66XX_OSAL.h new file mode 100644 index 00000000..d61af0e9 --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TA66XX_OSAL.h @@ -0,0 +1,649 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 3A. + TI SYS/BIOS RTOS abstraction layer for TORNADO AMC embedded controllers. + (C) MicroLAB Systems, 2014-2015 + + + File: This file contains TI SYS/BIOS RTOS abstraction layer definitions + ----- for TORNADO AMC embedded controllers, which is used for various + low-level drivers (LLD) and libraries that the application use. + + + Revision history: + ----------------- + rev.1A - 2014, initial release for TORNADO-A6678 board + rev.2A - 2015, totally redesigned SDK; + rev.3A - 2016, added support for TORNADO-A6678/FMC board rev.1A; + +******************************************************************************/ + + +/** + * @file TA66XX_OSAL.h + * + * @brief RTOS abstraction layer definitions + * + * This file contains TI SYS/BIOS RTOS abstraction layer (OSAL) definitions for + * TORNADO AMC embedded controllers, which is used for various + * low-level drivers (LLD) and libraries that the application use. + * + */ + + +#ifndef __TA66XX_OSAL_H__ // check for this file has been already included +#define __TA66XX_OSAL_H__ 1 + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +//============================================================================= +//------------ Definitions ---------------------------------------------------- +//============================================================================= +/** @addtogroup TA66XX_OSAL_GENERAL OS abstraction layer (OSAL) general definitions + * @{ + */ + +// Hardware semaphore defs +#define TA66XX_OSAL_CPPI_HW_SEM 1 /**< CPPI LLD hardware semaphore */ +#define TA66XX_OSAL_QMSS_HW_SEM 2 /**< QMSS LLD hardware semaphore */ +#define TA66XX_OSAL_SRIO_HW_SEM 3 /**< SRIO LLD hardware semaphore */ +#define TA66XX_OSAL_SPI_HW_SEM 4 /**< SPI driver hardware semaphore */ + +/** Macro to define high-priority QMSS queue for accumulator (depends on DSP event ID and core number) */ +#define TA66XX_OSAL_set_qmss_queue_acc(eventid, core) (704 + (eventid - 48) * 8 + core) + +// Interrupts and event IDs used by NIMU library (DSP core 0 is assumed to be used) +#define TA66XX_OSAL_ETHERNET_AMC_EVENTID 48 /**< Ethernet AMC port event - used by NIMU library */ +#define TA66XX_OSAL_ETHERNET_AMC_INTERRUPT 7 /**< Ethernet AMC port interrupt - used by NIMU library */ +/** QMSS queue for AMC Ethernet port accumulator (depends on TA66XX_OSAL_ETHERNET_AMC_EVENTID) */ +#define TA66XX_OSAL_ETHERNET_AMC_QMSS_QUEUE_ACC TA66XX_OSAL_set_qmss_queue_acc(TA66XX_OSAL_ETHERNET_AMC_EVENTID, 0) +#define TA66XX_OSAL_ETHERNET_PHY_EVENTID 49 /**< Ethernet PHY port event - used by NIMU library */ +#define TA66XX_OSAL_ETHERNET_PHY_INTERRUPT 8 /**< Ethernet PHY port interrupt - used by NIMU library */ +/** QMSS queue for PHY Ethernet port accumulator (depends on TA66XX_OSAL_ETHERNET_PHY_EVENTID) */ +#define TA66XX_OSAL_ETHERNET_PHY_QMSS_QUEUE_ACC TA66XX_OSAL_set_qmss_queue_acc(TA66XX_OSAL_ETHERNET_PHY_EVENTID, 0) + +// Interrupts and event IDs used by SRIO (DSP core 0 is assumed to be used) +#define TA66XX_OSAL_SRIO_MESSAGES_EVENTID 50 /**< SRIO event ID used by messages (Type 9 and Type 11) */ +#define TA66XX_OSAL_SRIO_INTERRUPT 9 /**< SRIO interrupt */ +/** QMSS queue for SRIO accumulator (depends on TA66XX_OSAL_SRIO_MESSAGES_EVENTID) */ +#define TA66XX_OSAL_SRIO_QMSS_QUEUE_ACC TA66XX_OSAL_set_qmss_queue_acc(TA66XX_OSAL_SRIO_MESSAGES_EVENTID, 0) +#define TA66XX_OSAL_SRIO_DIO_EVENTID 20 /**< SRIO event ID used by DirectIO (INTDST(n + 16), n - core number) */ +/** @}*/ +//============================================================================= + + + +//============================================================================= +//------------ Global variables ----------------------------------------------- +//============================================================================= +extern uint32_t qmssMallocCounter; +extern uint32_t qmssFreeCounter; +extern uint32_t cppiMallocCounter; +extern uint32_t cppiFreeCounter; +extern uint32_t srioMallocCounter; +extern uint32_t srioFreeCounter; +extern uint32_t srioDataBufferMallocCounter; +extern uint32_t srioDataBufferFreeCounter; +//============================================================================= + + + +//============================================================================= +//============ T-AMC controllers OSAL functions declarations ================== +//============================================================================= +/** @addtogroup TA66XX_OSAL_FUNCTIONS TORNADO AMC OSAL functions + * @{ + */ + + +//============================================================================= +//============ QMSS LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_qmssBeginMemAccess() function ------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssBeginMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_qmssEndMemAccess() function --------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssEndMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_qmssMalloc() function --------------------------------*//** + * @brief Function implements the memory allocation library function + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_qmssMalloc(uint32_t num_bytes); + + +/*------------ Osal_qmssFree() function ----------------------------------*//** + * @brief Function implements the memory free library function + * + * This function frees up memory allocated using Osal_qmssMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssFree(Ptr dataPtr, uint32_t num_bytes); + + +/*------------ Osal_qmssCsEnter() function -------------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_qmssCsEnter(void); + + +/*------------ Osal_qmssCsExit() function --------------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_qmssCsEnter() API. + * + * @param[in] CsHandle - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_qmssCsExit(void *CsHandle); + +//============================================================================= + + + +//============================================================================= +//============ CPPI LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_cppiBeginMemAccess() function ------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiBeginMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_cppiEndMemAccess() function --------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiEndMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_cppiMalloc() function --------------------------------*//** + * @brief Function implements the memory allocation library function + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_cppiMalloc(uint32_t num_bytes); + + +/*------------ Osal_cppiFree() function ----------------------------------*//** + * @brief Function implements the memory free library function + * + * This function frees up memory allocated using Osal_cppiMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiFree(Ptr dataPtr, uint32_t num_bytes); + + +/*------------ Osal_cppiCsEnter() function -------------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_cppiCsEnter(void); + + +/*------------ Osal_cppiCsExit() function --------------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_cppiCsEnter() API. + * + * @param[in] CsHandle - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_cppiCsExit(void *CsHandle); + +//============================================================================= + + +#ifdef __TA66XX_FUNCTIONS_INCLUDE_SRIO__ + + +//============================================================================= +//============ SRIO LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_srioBeginMemAccess() function ------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioBeginMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_srioEndMemAccess() function --------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] ptr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioEndMemAccess(void *ptr, uint32_t size); + + +/*------------ Osal_srioBeginDescriptorAccess() function -----------------*//** + * @brief Function is invoked by the SRIO LLD to indicate that a descriptor is + * being accessed. + * + * @param[in] drvHandle - driver instance for which descriptor is being + * accessed + * @param[in] ptr - pointer to the descriptor being accessed + * @param[in] descSize - size of the descriptor (valid only for driver managed + * configuration) + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioBeginDescriptorAccess(Srio_DrvHandle drvHandle, void *ptr, uint32_t descSize); + + +/*------------ Osal_srioEndDescriptorAccess() function -------------------*//** + * @brief Function is invoked by the SRIO LLD to indicate that a descriptor is + * finished being accessed. + * + * @param[in] drvHandle - driver instance for which descriptor is being + * accessed + * @param[in] ptr - pointer to the descriptor being accessed + * @param[in] descSize - size of the descriptor (valid only for driver managed + * configuration) + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioEndDescriptorAccess(Srio_DrvHandle drvHandle, void *ptr, uint32_t descSize); + + +/*------------ Osal_srioMalloc() function --------------------------------*//** + * @brief Function implements the memory allocation library function + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_srioMalloc(uint32_t num_bytes); + + +/*------------ Osal_srioFree() function ----------------------------------*//** + * @brief Function implements the memory free library function + * + * This function frees up memory allocated using Osal_srioMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioFree(Ptr dataPtr, uint32_t num_bytes); + + +/*------------ Osal_dataBufferInitMemory() function ----------------------*//** + * @brief Function is used to allocate a block of memory for all the data + * buffer operations. This function is called by the application. + * + * @param[in] dataBufferSize - size of each data buffer + * + * @return Error code + * +-----------------------------------------------------------------------------*/ +int32_t Osal_dataBufferInitMemory(uint32_t dataBufferSize); + + +/*------------ Osal_srioDataBufferMalloc() function ----------------------*//** + * @brief Function is used to allocate a data buffer of the specified size. + * Data buffers should always be allocated from the global address space. + * + * @param[in] numBytes - number of bytes to be allocated + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +void *Osal_srioDataBufferMalloc(uint32_t numBytes); + + +/*------------ Osal_srioDataBufferFree() function ------------------------*//** + * @brief Function is used to clean up a previously allocated data buffer + * block. All data buffers are in the global address space. + * + * @param[in] ptr - pointer to the memory block to be cleaned up + * @param[in] numBytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioDataBufferFree(void *ptr, uint32_t numBytes); + + +/*------------ Osal_srioLog() function -----------------------------------*//** + * @brief Function is used to log the messages from SRIO LLD on the console. + * + * @param[in] fmt - formatted string + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioLog(String fmt, ... ); + + +/*------------ Osal_srioCreateSem() function -----------------------------*//** + * @brief Function is used to create a critical section. + * + * @return Semaphore handle created + * +-----------------------------------------------------------------------------*/ +void *Osal_srioCreateSem(void); + + +/*------------ Osal_srioDeleteSem() function -----------------------------*//** + * @brief Function is used to delete a critical section. + * + * @param[in] semHandle - semaphore handle to be deleted + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioDeleteSem(void *semHandle); + + +/*------------ Osal_srioPendSem() function -------------------------------*//** + * @brief Function is used to pend on a semaphore + * + * @param[in] semHandle - semaphore handle on which the API will pend + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioPendSem(void *semHandle); + + +/*------------ Osal_srioPostSem() function -------------------------------*//** + * @brief Function is used to post a semaphore + * + * @param[in] semHandle - semaphore handle which will be posted + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioPostSem(void *semHandle); + + +/*------------ Osal_srioEnterMultipleCoreCriticalSection() function ------*//** + * @brief Function is used to protect the driver shared resources across + * multiple cores. + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_srioEnterMultipleCoreCriticalSection(void); + + +/*------------ Osal_srioExitMultipleCoreCriticalSection() function -------*//** + * @brief Function is called to end the critical section which was protecting + * shared resources from access across multiple cores. + * + * @param[in] critSectHandle - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioExitMultipleCoreCriticalSection(void *critSectHandle); + + +/*------------ Osal_srioEnterSingleCoreCriticalSection() function --------*//** + * @brief Function is used to provide critical section to prevent access of + * shared resources from single core and multiple threads. + * + * @param[in] drvHandle - driver handle which needs critical section to + * protect its resources + * + * @return Handle used to lock critical section + * +-----------------------------------------------------------------------------*/ +void *Osal_srioEnterSingleCoreCriticalSection(Srio_DrvHandle drvHandle); + + +/*------------ Osal_srioExitSingleCoreCriticalSection() function ---------*//** + * @brief Function is called to end the critical section access of shared + * resources from single cores. + * + * @param[in] drvHandle - driver handle which needs critical section to + * protect its resources + * @param[in] critSectHandle - critical handle retreived by + * Osal_srioEnterSingleCoreCriticalSection() function call + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_srioExitSingleCoreCriticalSection(Srio_DrvHandle drvHandle, void *critSectHandle); + +//============================================================================= + + +#endif /* __TA66XX_FUNCTIONS_INCLUDE_SRIO__ */ + + +//============================================================================= +//============ NIMU LLD OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_nimuMalloc() function --------------------------------*//** + * @brief Function implements the memory allocate function for the NIMU + * library. + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * @param[in] alignment - alignment of allocated memory block in bytes + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +Ptr Osal_nimuMalloc(uint32_t num_bytes, uint32_t alignment); + + +/*------------ Osal_nimuFree() function ----------------------------------*//** + * @brief Function implements the memory free function for the NIMU library. + * + * This function frees up memory allocated using Osal_nimuMalloc() + * function call. + * + * @param[in] dataPtr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_nimuFree(Ptr dataPtr, uint32_t num_bytes); + +//============================================================================= + + + +//============================================================================= +//============ PASS LLD OSAL functions ======================================== +//============================================================================= + + +/*------------ Osal_paBeginMemAccess() function --------------------------*//** + * @brief Function is used to indicate that a block of memory is about to be + * accessed + * + * If the memory block is cached then this indicates that the application + * would need to ensure that the cache is updated with the data from the actual + * memory + * + * @param[in] addr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paBeginMemAccess(Ptr addr, uint32_t size); + + +/*------------ Osal_paEndMemAccess() function ----------------------------*//** + * @brief Function is used to indicate that the block of memory has finished + * being accessed + * + * If the memory block is cached then the application would need to ensure that + * the contents of the cache are updated immediately to the actual memory. + * + * @param[in] addr - address of memory block + * @param[in] size - size of memory block + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paEndMemAccess(Ptr addr, uint32_t size); + + +/*------------ Osal_paMtCsEnter() function -------------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @param[out] key - pointer to a variable to receive a handle for unlocking + * critical section + + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paMtCsEnter(uint32_t *key); + + +/*------------ Osal_paMtCsExit() function --------------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_paMtCsEnter() API. + * + * @param[in] key - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_paMtCsExit(uint32_t key); + +/** @}*/ +//============================================================================= + + + +#ifdef __cplusplus +} +#endif + + + +//============================================================================= +#endif /* __TA66XX_OSAL_H__ */ diff --git a/ports/c667x/ccs/example_build/include/TASDK_ERR.h b/ports/c667x/ccs/example_build/include/TASDK_ERR.h new file mode 100644 index 00000000..8245e95b --- /dev/null +++ b/ports/c667x/ccs/example_build/include/TASDK_ERR.h @@ -0,0 +1,87 @@ +/****************************************************************************** + TORNADO AMC modules Software Development Kit (SDK). Rev 4A. + (C) MicroLAB Systems, 2015-2017 + + + File: TORNADO AMC SDK functions errors + ----- + +******************************************************************************/ + + +/** + * @file TASDK_ERR.h + * + * @brief SDK functions errors + * + * This file contains TORNADO AMC SDK functions errors + * + */ + + +#ifndef __TASDK_ERR_H__ // check for this file has been already included +#define __TASDK_ERR_H__ 1 + + +//============================================================================= +//============ Returned error codes =========================================== +//============================================================================= +/** @addtogroup TASDK_ERRORS SDK API functions returned error codes + * @{ + */ +#define TASDK_OK 0 /**< No errors */ +#define TASDK_PARAM_ERR -100 /**< Erroneous function parameter */ +#define TASDK_INVALID_HW_ERR -101 /**< Invalid H/W error (invalid board, etc.) */ +#define TASDK_HW_ERR -102 /**< H/W error (error writing to the DSP control registers, etc) */ +#define TASDK_SYS_CALL_ERR -103 /**< system API call error */ +#define TASDK_INVALID_DSP_CORE_ERR -104 /**< Only DSP core 0 may call the function */ +#define TASDK_INVALID_DSP_CORE_BOOT_ADDR_ERR -105 /**< Invalid DSP core boot address */ +#define TASDK_API_OPEN_ERR -106 /**< API has not been open */ +#define TASDK_MMC_TO_CPU_COMM_CHECKSUM_ERR -150 /**< Invalid data frame checksum */ +#define TASDK_MMC_TO_CPU_COMM_DATA_BUF_LEN_ERR -151 /**< Data buffer is not large enough to store received data frame */ +#define TASDK_MMC_TO_CPU_COMM_INV_CMD_ERR -152 /**< Invalid command */ +#define TASDK_MMC_TO_CPU_COMM_RECV_DATA_LEN_ERR -153 /**< Invalid received data length */ +#define TASDK_MMC_TO_CPU_COMM_RECV_DATA_INV_ERR -154 /**< Received data is invalid */ +#define TASDK_MMC_TO_CPU_COMM_TIMEOUT_ERR -155 /**< MMC-to-DSP communication timeout error */ +#define TASDK_SFP_NOT_INSTALLED_ERR -156 /**< SFP module is not installed */ +#define TASDK_FMC_NOT_INSTALLED_ERR -157 /**< FMC module is not installed */ +#define TASDK_FMC_INFO_INVALID_ERR -158 /**< FMC module info is invalid */ +#define TASDK_FLASH_INV_DEV_ERR -200 /**< unsupported FLASH device */ +#define TASDK_FLASH_ERASE_ERR -201 /**< FLASH erase error */ +#define TASDK_FLASH_WR_ERR -202 /**< FLASH write error */ +#define TASDK_FLASH_CANNOT_WR_ERR -203 /**< FLASH contents does not allow to write this data */ +#define TASDK_FLASH_INV_RD_ERR -204 /**< invalid FLASH read data during AUTO-SELECT */ +#define TASDK_FLASH_INFO_NOT_MATCH_ERR -205 /**< FLASH info from the FLASH chip does not match FLASH_LEN_ID from System Configuration register */ +#define TASDK_FLASH_SECTOR_WRPROT_ERR -206 /**< FLASH sector is write-protected */ +#define TASDK_FLASH_WR_BUF_ABORT_ERR -207 /**< FLASH write-to-buffer program is aborted */ +#define TASDK_FLASH_HW_WP_ERR -208 /**< FLASH writes are disabled by on-board switch */ +#define TASDK_FLASH_WR_DISABLED_ERR -209 /**< FLASH writes are disabled by application */ +#define TASDK_FPGA_CNF_BITFILE_HD_FORMAT_ERR -500 /**< invalid FPGA bitfile header format */ +#define TASDK_FPGA_CNF_LOAD_ERR -501 /**< error during FPGA configuration */ +#define TASDK_FPGA_CNF_CRC_ERR -502 /**< CRC check failed during FPGA configuration */ +#define TASDK_FPGA_CNF_LOAD_LEN_ERR -503 /**< not all the data has been loaded */ +#define TASDK_FPGA_CNF_BITFILE_INV_PART_ERR -504 /**< invalid FPGA bitfile header part name */ +#define TASDK_FPGA_CNF_INV_IF_ERR -505 /**< invalid FPGA configuration interface selected */ +#define TASDK_FLASH_RECORD_GLOBAL_HD_NOT_VALID_ERR -600 /**< FLASH record global header is invalid */ +#define TASDK_FLASH_RECORD_HD_NOT_VALID_ERR -601 /**< FLASH record header is invalid */ +#define TASDK_FLASH_RECORD_HD_LIST_NOT_VALID_ERR -602 /**< FLASH record header list is invalid */ +#define TASDK_FLASH_RECORD_FREE_SPACE_ERR -603 /**< not available free space in FLASH */ +#define TASDK_FLASH_RECORD_CHECKSUM_ERR -604 /**< FLASH record checksum mismatch */ +#define TASDK_FLASH_RECORD_ALREADY_OPENED_ERR -605 /**< another FLASH record is opened for writing */ +#define TASDK_FLASH_RECORD_INVALID_LOAD_ADDR_ERR -606 /**< invalid FLASH record load address */ +#define TASDK_FLASH_RECORD_INV_NUMBER_ERR -607 /**< invalid FLASH record number */ +#define TASDK_FLASH_BOOT_SEQ_NOT_VALID_ERR -608 /**< FLASH boot sequence is invalid */ +#define ELF_LOADER_BASE_ERR -1000 /**< ELF file loader base error */ +#define ELF_LOADER_PARAM_ERR (ELF_LOADER_BASE_ERR) /**< erroneous function parameter */ +#define ELF_LOADER_INV_ELF_HEADER_ERR (ELF_LOADER_BASE_ERR - 1) /**< invalid ELF header */ +#define ELF_LOADER_INV_FILE_TYPE_ERR (ELF_LOADER_BASE_ERR - 2) /**< invalid file type (non-executable) */ +#define ELF_LOADER_INV_ENTRY_POINT_ERR (ELF_LOADER_BASE_ERR - 3) /**< invalid entry-point address */ +#define ELF_LOADER_INV_SEGMENT_ERR (ELF_LOADER_BASE_ERR - 4) /**< invalid or missing segment data */ +/** @}*/ +//============================================================================= + + + +//============================================================================= +#endif /* __TASDK_ERR_H__ */ + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject new file mode 100644 index 00000000..9c03abfb --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.ccsproject @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject new file mode 100644 index 00000000..f4a158fb --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.cproject @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project new file mode 100644 index 00000000..b18fc136 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.project @@ -0,0 +1,89 @@ + + + sample_threadx_c6678evm + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + -k + + + org.eclipse.cdt.make.core.buildCommand + ${CCS_UTILS_DIR}/bin/gmake + + + org.eclipse.cdt.make.core.buildLocation + ${BuildDirectory} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + false + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + ORIGINAL_PROJECT_ROOT + file:/C:/release/threadx/sample_threadx_c6678evm + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..f653028c --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..2adc7b1d --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..093dbb95 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//Debug/makefile=UTF-8 +encoding//Debug/objects.mk=UTF-8 +encoding//Debug/sources.mk=UTF-8 +encoding//Debug/subdir_rules.mk=UTF-8 +encoding//Debug/subdir_vars.mk=UTF-8 diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c new file mode 100644 index 00000000..31e8056b --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.c @@ -0,0 +1,441 @@ +/* + * board_setup.c + * + */ + + +#include "board_setup.h" +#include "C66XX.h" +#include + + +//============================================================================= +//============ General definitions ============================================ +//============================================================================= +// DSP Timer-8 definition +#define C66XX_DSP_TIMER C66XX_TIMER_8 +// DSP Timer-8 output frequency in Hz +#define C66XX_DSP_TIMER_FREQ 100 +/* DSP Timer-8 interrupt event ID */ +#define C66XX_DSP_TIMER_EVENT_ID 67 +//============================================================================= + + +//============================================================================= +//============ Global functions =============================================== +//============================================================================= +void _tx_nmi_vector(void); +void _tx_int4_vector(void); +void _tx_int5_vector(void); +void _tx_int6_vector(void); +void _tx_int7_vector(void); +void _tx_int8_vector(void); +void _tx_int9_vector(void); +void _tx_int10_vector(void); +void _tx_int11_vector(void); +void _tx_int12_vector(void); +void _tx_int13_vector(void); +void _tx_int14_vector(void); +void _tx_int15_vector(void); +//============================================================================= + + +//============================================================================= +//============ Static functions =============================================== +//============================================================================= +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency); +static int32_t tx_interrupt_init(void); +//============================================================================= + + +/*------------ init_output_timer() function ----------------------------------- + * DESCRIPTION: Function initializes Timer64 module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency) +{ + int32_t r; + C66XX_TIMER_CFG_DD cfg_dd; + + // Reset 64-bit timer + if ((r = C66XX_TIMER_reset(timer, C66XX_TIMER_HW_CFG_64BIT)) != C66XX_OK) + goto exit; + + // Fill configuration data descriptor + memset(&cfg_dd, 0, C66XX_TIMER_CFG_DD_LEN); + cfg_dd.timer_mode = C66XX_TIMER_MODE_32BIT_UNCHAINED; + cfg_dd.timer_high.clk_src_output_mode = C66XX_TIMER_CLK_OUTPUT_MODE_CLK; + // Init DSP Timer64 module + if ((r = C66XX_TIMER_init(timer, frequency, &cfg_dd)) != C66XX_OK) + goto exit; + + // Enable timer interrupt + if ((r = C66XX_TIMER_enable_interrupts(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH)) != C66XX_OK) + goto exit; + + // Start 32-bit timer high to enable continuously + if ((r = C66XX_TIMER_start(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH, C66XX_TIMER_COUNT_MODE_CONTINUOUSLY)) != C66XX_OK) + goto exit; + + // TIMER module configuration is completed + printf("Timer #%u configuration is completed\n", timer); + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_interrupt_init() function ----------------------------------- + * DESCRIPTION: Function initializes CorePack interrupt module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_interrupt_init(void) +{ + int32_t r; + + // Set DSP interrupt handlers to the ones defined in tx_initialize_low_level.asm + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_NMI, _tx_nmi_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_4, _tx_int4_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_5, _tx_int5_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_6, _tx_int6_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_7, _tx_int7_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_8, _tx_int8_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_9, _tx_int9_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_10, _tx_int10_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_11, _tx_int11_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_12, _tx_int12_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_13, _tx_int13_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_14, _tx_int14_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_15, _tx_int15_vector)) != C66XX_OK) + goto exit; + + /* CorePack interrupt module configuration is completed */ + printf("INTC configuration is completed\n"); + // Exit without errors + r = C66XX_OK; + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup() +{ + platform_init_flags init_flags; + platform_init_config init_config; + platform_info p_info; + int32_t r; + + /* + * Initialize all platform peripherals with default values: + * PLL, DDR, TCSL, PHY, ECC + */ + init_flags.pll = 1; + init_flags.ddr = 1; + init_flags.tcsl = 1; + init_flags.phy = 1; + init_flags.ecc = 0; + memset(&init_config, 0, sizeof(platform_init_config)); + if ((r = platform_init(&init_flags, &init_config)) != Platform_EOK) + goto exit; + + /* Initialize platform UART */ + if ((r = platform_uart_init()) != Platform_EOK) + goto exit; + if ((r = platform_uart_set_baudrate(115200)) != Platform_EOK) + goto exit; + + /* Get platform info */ + platform_get_info(&p_info); + /* Write data to the UART */ + platform_write("Platform library version is %s\n", p_info.version); + platform_write("Board name is %s\n", p_info.board_name); + platform_write("Board serial number is %s\n", p_info.serial_nbr); + platform_write("Board revision ID is %u\n", p_info.board_rev); + platform_write("CPU name is %s\n", p_info.cpu.name); + platform_write("CPU revision ID is %u\n", p_info.cpu.revision_id); + platform_write("Number of CPU cores is %u\n", p_info.cpu.core_count); + platform_write("CPU frequency is %u MHz\n", p_info.frequency); + + // Init CorePac INTC + if ((r = C66XX_INT_init_core()) != C66XX_OK) + goto exit; + + // Init DSP Timer + if ((r = tx_timer_init(C66XX_DSP_TIMER, C66XX_DSP_TIMER_FREQ)) != C66XX_OK) + goto exit; + + // Init DSP interrupt controller + if ((r = tx_interrupt_init()) != C66XX_OK) + goto exit; + + printf("Board is initialized\n"); + /* Exit with no errors */ + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +//============================================================================= +//============ Platform OSAL functions ======================================== +//============================================================================= + +/*------------ Osal_platformMalloc() function ----------------------------*//** + * @brief Function implements the memory allocate function for the platform + * library. + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * @param[in] alignment - alignment of allocated memory block in bytes + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +uint8_t *Osal_platformMalloc(uint32_t num_bytes, uint32_t alignment) +{ + // Allocate memory from default system heap + return (NULL); +} +//----------------------------------------------------------------------------- + + +/*------------ Osal_platformFree() function ------------------------------*//** + * @brief Function implements the memory free function for the platform + * library. + * + * This function frees up memory allocated using Osal_platformMalloc() + * function call. + * + * @param[in] mem_ptr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformFree(uint8_t *mem_ptr, uint32_t num_bytes) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ Osal_platformSpiCsEnter() function ------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @param[out] key - pointer to a variable to receive a handle for unlocking + * critical section + + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsEnter(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ Osal_platformSpiCsExit() function -------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_paMtCsEnter() API. + * + * @param[in] key - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsExit(void) +{ +} +//----------------------------------------------------------------------------- + + +//============================================================================= + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h new file mode 100644 index 00000000..9e252dcd --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/board_setup.h @@ -0,0 +1,209 @@ +/* + * board_setup.h + * + */ + + +#ifndef BOARD_SETUP_H /* check for this file has been already included */ +#define BOARD_SETUP_H 1 + + +#include "ti\platform\platform.h" + + +/*===========================================================================*/ +/*============ Printf output definitions ====================================*/ +/*===========================================================================*/ +#define printf platform_write +/*===========================================================================*/ + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup(); + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void); + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void); + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void); + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void); + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void); + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void); + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void); + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void); + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void); + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void); + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void); + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void); + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void); + + +/*------------ Osal_platformMalloc() function ----------------------------*//** + * @brief Function implements the memory allocate function for the platform + * library. + * + * This function allocates a memory block of a given size specified by input + * parameter 'num_bytes'. + * + * @param[in] num_bytes - number of bytes to be allocated + * @param[in] alignment - alignment of allocated memory block in bytes + * + * @return Allocated block address + * +-----------------------------------------------------------------------------*/ +uint8_t *Osal_platformMalloc(uint32_t num_bytes, uint32_t alignment); + + +/*------------ Osal_platformFree() function ------------------------------*//** + * @brief Function implements the memory free function for the platform + * library. + * + * This function frees up memory allocated using Osal_platformMalloc() + * function call. + * + * @param[in] mem_ptr - pointer to the memory block to be cleaned up + * @param[in] num_bytes - size of the memory block to be cleaned up in bytes + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformFree(uint8_t *mem_ptr, uint32_t num_bytes); + + +/*------------ Osal_platformSpiCsEnter() function ------------------------*//** + * @brief Function is used to enter a critical section + * + * Function protects against access from multiple cores and access from + * multiple threads on single core + * + * @param[out] key - pointer to a variable to receive a handle for unlocking + * critical section + + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsEnter(void); + + +/*------------ Osal_platformSpiCsExit() function -------------------------*//** + * @brief Function is used to exit a critical section protected using + * Osal_paMtCsEnter() API. + * + * @param[in] key - handle for unlocking critical section + * + * @return None + * +-----------------------------------------------------------------------------*/ +void Osal_platformSpiCsExit(void); + + +/*===========================================================================*/ +#endif /* BOARD_SETUP_H */ + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c new file mode 100644 index 00000000..18bad8de --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.c @@ -0,0 +1,528 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include "board_setup.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define TraceX trace oblects */ +#define TRACE_BUFFER_SIZE (4 * 1024) +#define TRACE_OBJECTS_COUNT 20 +/* Define TraceX trace buffer */ +UCHAR tx_trace_buffer[TRACE_BUFFER_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define demo timer */ +#define DEMO_TIMER_PERIOD 10 +#define DEMO_TIMER_VALUE 0xaaaaaaaa +TX_TIMER timer_0; +ULONG timer_0_counter; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); +void my_stack_error_handler(TX_THREAD *thread_ptr); +void my_timer_function(ULONG timer_input); + + +/* Define main entry point. */ + +void main() +{ + /* Setup the hardware. */ + hardware_setup(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; +UINT status; + + /* Enable event tracing using the global “trace_buffer” memory and supporting + a maximum of TRACE_OBJECTS_COUNT ThreadX objects in the registry. */ + if ((status = tx_trace_enable(tx_trace_buffer, TRACE_BUFFER_SIZE, TRACE_OBJECTS_COUNT)) != TX_SUCCESS) + { + while (1); + } + + /* Register thread stack error notification callback */ + if ((status = tx_thread_stack_error_notify(my_stack_error_handler)) != TX_SUCCESS) + { + while (1); + } + + /* Create a byte memory pool from which to allocate the thread stacks. */ + status = tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the main thread. */ + status = tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 1. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + status = tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 2. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 3. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + status = tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 4. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 5. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + status = tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 6. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + status = tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 7. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the message queue. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the message queue shared by threads 1 and 2. */ + status = tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the semaphore used by threads 3 and 4. */ + status = tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the event flags group used by threads 1 and 5. */ + status = tx_event_flags_create(&event_flags_0, "event flags 0"); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + status = tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the memory for a small block pool. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create a block memory pool to allocate a message buffer from. */ + status = tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate a block and release the block memory. */ + status = tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Release the block back to the pool. */ + status = tx_block_release(pointer); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the periodic timer. */ + status = tx_timer_create(&timer_0, "timer 0", my_timer_function, (ULONG) DEMO_TIMER_VALUE, DEMO_TIMER_PERIOD, DEMO_TIMER_PERIOD, TX_AUTO_ACTIVATE); + if (status != TX_SUCCESS) + { + while (1); + } +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void my_stack_error_handler(TX_THREAD *thread_ptr) +{ + while(1); +} + + +void my_timer_function(ULONG timer_input) +{ + /* Increment the thread counter. */ + timer_0_counter++; + + if (timer_input != DEMO_TIMER_VALUE) + while(1); +} + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd new file mode 100644 index 00000000..a2267231 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/sample_threadx.cmd @@ -0,0 +1,55 @@ +-c +-heap 0x400 +-stack 0x1000 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.ae66 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.intc.ae66 +-l c:\ti\pdk_C6678_1_1_2_6\packages\ti\platform\evmc6678l\platform_lib\lib\release\ti.platform.evm6678l.ae66 + +/* Memory Map */ +MEMORY +{ + L1PSRAM (RWX) : org = 0x00E00000, len = 0x00008000 + L1DSRAM (RWX) : org = 0x00F00000, len = 0x00008000 + CODE_RAM (RWX) : org = 0x00800000, len = 0x00020000 + DATA_RAM (RWX) : org = 0x00820000, len = 0x00060000 + MSMCSRAM (RWX) : org = 0x0c000000, len = 0x00400000 + DDR3 (RWX) : org = 0x80000000, len = 0x80000000 +} + +SECTIONS +{ + .text > CODE_RAM + .stack > CODE_RAM + .cio > CODE_RAM + .const > CODE_RAM + .data > CODE_RAM + .switch > CODE_RAM + .sysmem > CODE_RAM + .far > CODE_RAM + .args > CODE_RAM + .ppinfo > CODE_RAM + .ppdata > CODE_RAM + .csl_vect > CODE_RAM + platform_lib > CODE_RAM + + GROUP + { + .neardata + .rodata + .bss + } > CODE_RAM + + /* COFF sections */ + .pinit > CODE_RAM + .cinit > CODE_RAM + + /* EABI sections */ + .binit > CODE_RAM + .init_array > CODE_RAM + .fardata > CODE_RAM + .c6xabi.exidx > CODE_RAM + .c6xabi.extab > CODE_RAM + + /* ThreadX section which should be the last RAM section loaded */ + .zend > DATA_RAM +} diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml new file mode 100644 index 00000000..b7147d7f --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/TMS320C6678.ccxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt new file mode 100644 index 00000000..d783fef4 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file diff --git a/ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm new file mode 100644 index 00000000..cdc14f20 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_c6678evm/tx_initialize_low_level.asm @@ -0,0 +1,405 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + +SP .set B15 +ADDRESS_MSK .set 0xFFFFFFF0 ; Ensure 16-byte alignment + +; Use Timer 8 as it's available for all DSP cores at C6678 +; Timer 8 interrupt high event (TINT8H) ID is 67 +; Assume DSP core clock 1000 MHz +; Timer is clocked at DSP core clock / 6 = 167 MHz +; Timer frequency will set to 100 Hz +TMR8_INTCTLSTAT_ADDR .set 0x02280044 ; Timer 8 Interrupt Control and Status Register +INTCTLSTAT_VAL .set 0x00010000 ; Enable TIMHI interrupt + +EVTCLR2_ADDR .set 0x01800048 ; Event Clear register 2 address +EVTCLR2_TMR8_VAL .set 0x00000008 ; Clear event 67 - TINT8H + +EVTMASK2_ADDR .set 0x01800088 ; Event Mask register 2 address +EVTMASK2_TMR8_VAL .set 0x00000008 ; Mask event 67 - TINT8H + +INTMUX1_ADDR .set 0x01800104 ; Interrupt Mux Register 1 address +INTMUX1_TMR8_VAL .set 0x43 ; Tie in Event 67 (TINT8H) to INT4 +; +; + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + + +; External interrupt handlers - should be defined by user + .global tx_nmi_handler + .global tx_int5_handler + .global tx_int6_handler + .global tx_int7_handler + .global tx_int8_handler + .global tx_int9_handler + .global tx_int10_handler + .global tx_int11_handler + .global tx_int12_handler + .global tx_int13_handler + .global tx_int14_handler + .global tx_int15_handler + +; +; +;/* Define the first available address in memory, which is typically just the last +; RAM section loaded. */ + .sect ".zend" + .space 20 + .global _tx_first_free_memory + .align 16 +_tx_first_free_memory: + .space 4 + +; Useful macro definitions +; Load 32-bit integer into register +MVK_LH .macro val,reg + MVKL val,reg + MVKH val,reg + .endm +; Interrupt entry - allocate stack space, save A0-A4 and B3 registers to stack, +; build return address in B3 register for context save function and +; call context save function +TX_INTERRUPT_ENTRY .macro + ADDK.S2 -288,SP + STW B3,*+SP(96) + STW A0,*+SP(20) + STW A1,*+SP(24) + STW A2,*+SP(28) + STW A3,*+SP(32) + STW A4,*+SP(36) + B _tx_thread_context_save + .endm +; Interrupt exit - jump to context restore function +TX_INTERRUPT_EXIT .macro + B _tx_thread_context_restore + NOP 5 + .endm + + + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (SP); +; + MVK_LH _tx_thread_system_stack_ptr,A0 ; Build address of system stack + STW SP,*A0 ; Save system stack address +; +; /* Pickup the first available memory address. */ +; + MVK_LH ADDRESS_MSK,A0 ; Build address mask + MVK_LH _tx_first_free_memory,A1 ; Build address of free memory + AND A0,A1,A1 ; Ensure alignment +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) end; +; + MVK_LH _tx_initialize_unused_memory,A0 ; Build address of variable + STW A1,*A0 ; Save free memory address +; +; /* Setup Timer 8 HIGH interrupt event */ +; + MVK_LH INTMUX1_ADDR,A0 ; Select event 67 to send through INT4 + MVK_LH INTMUX1_TMR8_VAL,A1 + STW A1,*A0 + + MVK_LH EVTMASK2_ADDR,A0 ; Build address of Event Mask 2 Register + MVK_LH EVTMASK2_TMR8_VAL,A1 ; Build value of Event Mask 2 Register + STW A1,*A0 +; +; /* Done, return to caller. */ +; + B B3 ; Return to caller + NOP 5 ; Delay slots +;} +; + + + .global _tx_nmi_vector + .global _tx_nmi_vector_processing +_tx_nmi_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_nmi_vector_processing,B3 + MVKH _tx_nmi_vector_processing,B3 + NOP 3 +_tx_nmi_vector_processing: + CALLP tx_nmi_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int4_vector +_tx_int4_vector: + ADDK.S2 -288,SP ; Allocate stack space + STW B3,*+SP(96) ; Save B3 + STW A0,*+SP(20) ; Save A0 + STW A1,*+SP(24) ; Save A1 + STW A2,*+SP(28) ; Save A2 + STW A3,*+SP(32) ; Save A3 + STW A4,*+SP(36) ; Save A4 + NOP + +;_tx_timer_interrupt_preamble: + + MVK_LH TMR8_INTCTLSTAT_ADDR,A0 ; Build address of Timer Interrupt Control Register + MVK_LH INTCTLSTAT_VAL,A1 ; Build value of Timer Interrupt Control Register + STW A1,*A0 ; Clear Timer Interrupts + +; Clear DSP Event flag - DSP events are not self-cleared + MVK_LH EVTCLR2_ADDR,A0 ; Build address of Event Clear 2 Register + MVK_LH EVTCLR2_TMR8_VAL,A1 ; Build value of Event Clear 2 Register + STW A1,*A0 ; Clear Timer Event + + MVK_LH _tx_timer_interrupt,A0 + B A0 ; Branch ThreadX timer ISR routine + NOP 5 ; Delay slots + NOP + + + + .global _tx_int5_vector + .global _tx_int5_vector_processing +_tx_int5_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int5_vector_processing,B3 + MVKH _tx_int5_vector_processing,B3 + NOP 3 +_tx_int5_vector_processing: + CALLP tx_int5_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int6_vector + .global _tx_int6_vector_processing +_tx_int6_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int6_vector_processing,B3 + MVKH _tx_int6_vector_processing,B3 + NOP 3 +_tx_int6_vector_processing: + CALLP tx_int6_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int7_vector + .global _tx_int7_vector_processing +_tx_int7_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int7_vector_processing,B3 + MVKH _tx_int7_vector_processing,B3 + NOP 3 +_tx_int7_vector_processing: + CALLP tx_int7_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int8_vector + .global _tx_int8_vector_processing +_tx_int8_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int8_vector_processing,B3 + MVKH _tx_int8_vector_processing,B3 + NOP 3 +_tx_int8_vector_processing: + CALLP tx_int8_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int9_vector + .global _tx_int9_vector_processing +_tx_int9_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int9_vector_processing,B3 + MVKH _tx_int9_vector_processing,B3 + NOP 3 +_tx_int9_vector_processing: + CALLP tx_int9_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int10_vector + .global _tx_int10_vector_processing +_tx_int10_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int10_vector_processing,B3 + MVKH _tx_int10_vector_processing,B3 + NOP 3 +_tx_int10_vector_processing: + CALLP tx_int10_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int11_vector + .global _tx_int11_vector_processing +_tx_int11_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int11_vector_processing,B3 + MVKH _tx_int11_vector_processing,B3 + NOP 3 +_tx_int11_vector_processing: + CALLP tx_int11_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int12_vector + .global _tx_int12_vector_processing +_tx_int12_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int12_vector_processing,B3 + MVKH _tx_int12_vector_processing,B3 + NOP 3 +_tx_int12_vector_processing: + CALLP tx_int12_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int13_vector + .global _tx_int13_vector_processing +_tx_int13_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int13_vector_processing,B3 + MVKH _tx_int13_vector_processing,B3 + NOP 3 +_tx_int13_vector_processing: + CALLP tx_int13_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int14_vector + .global _tx_int14_vector_processing +_tx_int14_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int14_vector_processing,B3 + MVKH _tx_int14_vector_processing,B3 + NOP 3 +_tx_int14_vector_processing: + CALLP tx_int14_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int15_vector + .global _tx_int15_vector_processing +_tx_int15_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int15_vector_processing,B3 + MVKH _tx_int15_vector_processing,B3 + NOP 3 +_tx_int15_vector_processing: + CALLP tx_int15_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject new file mode 100644 index 00000000..d9b816a4 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.ccsproject @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject new file mode 100644 index 00000000..ee74925b --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.cproject @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project new file mode 100644 index 00000000..cbdff31c --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.project @@ -0,0 +1,89 @@ + + + sample_threadx_ta6678fmc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + -k + + + org.eclipse.cdt.make.core.buildCommand + ${CCS_UTILS_DIR}/bin/gmake + + + org.eclipse.cdt.make.core.buildLocation + ${BuildDirectory} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + false + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + ORIGINAL_PROJECT_ROOT + file:/C:/release/threadx/sample_threadx_ta6678fmc + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..f653028c --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..2adc7b1d --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..093dbb95 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//Debug/makefile=UTF-8 +encoding//Debug/objects.mk=UTF-8 +encoding//Debug/sources.mk=UTF-8 +encoding//Debug/subdir_rules.mk=UTF-8 +encoding//Debug/subdir_vars.mk=UTF-8 diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c new file mode 100644 index 00000000..e5b8a0bf --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.c @@ -0,0 +1,329 @@ +/* + * board_setup.c + * + */ + + +#include "board_setup.h" +#include + + +//============================================================================= +//============ General definitions ============================================ +//============================================================================= +// DSP Timer-8 definition +#define C66XX_DSP_TIMER C66XX_TIMER_8 +// DSP Timer-8 output frequency in Hz +#define C66XX_DSP_TIMER_FREQ 100 +/* DSP Timer-8 interrupt event ID */ +#define C66XX_DSP_TIMER_EVENT_ID 67 +//============================================================================= + + +//============================================================================= +//============ Global functions =============================================== +//============================================================================= +void _tx_nmi_vector(void); +void _tx_int4_vector(void); +void _tx_int5_vector(void); +void _tx_int6_vector(void); +void _tx_int7_vector(void); +void _tx_int8_vector(void); +void _tx_int9_vector(void); +void _tx_int10_vector(void); +void _tx_int11_vector(void); +void _tx_int12_vector(void); +void _tx_int13_vector(void); +void _tx_int14_vector(void); +void _tx_int15_vector(void); +//============================================================================= + + +//============================================================================= +//============ Static functions =============================================== +//============================================================================= +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency); +static int32_t tx_interrupt_init(void); +//============================================================================= + + +/*------------ init_output_timer() function ----------------------------------- + * DESCRIPTION: Function initializes Timer64 module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_timer_init(C66XX_TIMER timer, uint32_t frequency) +{ + int32_t r; + C66XX_TIMER_CFG_DD cfg_dd; + + // Reset 64-bit timer + if ((r = C66XX_TIMER_reset(timer, C66XX_TIMER_HW_CFG_64BIT)) != C66XX_OK) + goto exit; + + // Fill configuration data descriptor + memset(&cfg_dd, 0, C66XX_TIMER_CFG_DD_LEN); + cfg_dd.timer_mode = C66XX_TIMER_MODE_32BIT_UNCHAINED; + cfg_dd.timer_high.clk_src_output_mode = C66XX_TIMER_CLK_OUTPUT_MODE_CLK; + // Init DSP Timer64 module + if ((r = C66XX_TIMER_init(timer, frequency, &cfg_dd)) != C66XX_OK) + goto exit; + + // Enable timer interrupt + if ((r = C66XX_TIMER_enable_interrupts(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH)) != C66XX_OK) + goto exit; + + // Start 32-bit timer high to enable continuously + if ((r = C66XX_TIMER_start(timer, C66XX_TIMER_HW_CFG_32BIT_HIGH, C66XX_TIMER_COUNT_MODE_CONTINUOUSLY)) != C66XX_OK) + goto exit; + + // TIMER module configuration is completed + printf("Timer #%u configuration is completed\n", timer); + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_interrupt_init() function ----------------------------------- + * DESCRIPTION: Function initializes CorePack interrupt module + * ARGUMENTS: + * None + * RETURNED VALUE: Error code +-----------------------------------------------------------------------------*/ +static int32_t tx_interrupt_init(void) +{ + int32_t r; + + // Set DSP interrupt handlers to the ones defined in tx_initialize_low_level.asm + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_NMI, _tx_nmi_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_4, _tx_int4_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_5, _tx_int5_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_6, _tx_int6_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_7, _tx_int7_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_8, _tx_int8_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_9, _tx_int9_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_10, _tx_int10_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_11, _tx_int11_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_12, _tx_int12_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_13, _tx_int13_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_14, _tx_int14_vector)) != C66XX_OK) + goto exit; + if ((r = C66XX_INT_set_core_dsp_interrupt_handler(C66XX_DSP_VECTID_15, _tx_int15_vector)) != C66XX_OK) + goto exit; + + /* CorePack interrupt module configuration is completed */ + printf("INTC configuration is completed\n"); + // Exit without errors + r = TASDK_OK; + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup() +{ + int r; + + /* Init DSP */ + if ((r = TA66XX_BC_init()) != TASDK_OK) + goto exit; + + // Initialize UART + if ((r = TA66XX_BC_init_uart(C66XX_UART_BAUD_RATE_115200, C66XX_UART_DATA_BITS_8BITS, C66XX_UART_PARITY_NONE, C66XX_UART_STOP_BITS_1BIT)) != TASDK_OK) + goto exit; + + // Init DSP Timer + if ((r = tx_timer_init(C66XX_DSP_TIMER, C66XX_DSP_TIMER_FREQ)) != TASDK_OK) + goto exit; + + // Init DSP interrupt controller + if ((r = tx_interrupt_init()) != TASDK_OK) + goto exit; + + printf("Board is initialized\n"); + /* Exit with no errors */ + +exit: + return (r); +} +//----------------------------------------------------------------------------- + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void) +{ +} +//----------------------------------------------------------------------------- + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void) +{ +} +//----------------------------------------------------------------------------- + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h new file mode 100644 index 00000000..a65e3b9d --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/board_setup.h @@ -0,0 +1,151 @@ +/* + * board_setup.h + * + */ + + +#ifndef BOARD_SETUP_H // check for this file has been already included +#define BOARD_SETUP_H 1 + + +/* Include T-AMC DSP API */ +#include "TA66XX_DSP_BC.h" + + +//============================================================================= +//============ Printf output definitions ====================================== +//============================================================================= +#define printf TA66XX_BC_uart_printf +//============================================================================= + + +/*------------ hardware_setup() function -------------------------------------- + * DESCRIPTION: Function intializes board hardware + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +int hardware_setup(); + + +/*------------ tx_nmi_handler() function -------------------------------------- + * DESCRIPTION: Function handles NMI interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_nmi_handler(void); + + +/*------------ tx_int4_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT4 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int4_handler(void); + + +/*------------ tx_int5_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT5 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int5_handler(void); + + +/*------------ tx_int6_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT6 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int6_handler(void); + + +/*------------ tx_int7_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT7 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int7_handler(void); + + +/*------------ tx_int8_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT8 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int8_handler(void); + + +/*------------ tx_int9_handler() function ------------------------------------- + * DESCRIPTION: Function handles INT9 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int9_handler(void); + + +/*------------ tx_int10_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT10 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int10_handler(void); + + +/*------------ tx_int11_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT11 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int11_handler(void); + + +/*------------ tx_int12_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT12 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int12_handler(void); + + +/*------------ tx_int13_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT13 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int13_handler(void); + + +/*------------ tx_int14_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT14 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int14_handler(void); + + +/*------------ tx_int15_handler() function ------------------------------------ + * DESCRIPTION: Function handles INT15 interrupt + * ARGUMENTS: + * None + * RETURNED VALUE: None +-----------------------------------------------------------------------------*/ +void tx_int15_handler(void); + + +//============================================================================= +#endif /* BOARD_SETUP_H */ + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c new file mode 100644 index 00000000..18bad8de --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.c @@ -0,0 +1,528 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include "board_setup.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define TraceX trace oblects */ +#define TRACE_BUFFER_SIZE (4 * 1024) +#define TRACE_OBJECTS_COUNT 20 +/* Define TraceX trace buffer */ +UCHAR tx_trace_buffer[TRACE_BUFFER_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define demo timer */ +#define DEMO_TIMER_PERIOD 10 +#define DEMO_TIMER_VALUE 0xaaaaaaaa +TX_TIMER timer_0; +ULONG timer_0_counter; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); +void my_stack_error_handler(TX_THREAD *thread_ptr); +void my_timer_function(ULONG timer_input); + + +/* Define main entry point. */ + +void main() +{ + /* Setup the hardware. */ + hardware_setup(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; +UINT status; + + /* Enable event tracing using the global “trace_buffer” memory and supporting + a maximum of TRACE_OBJECTS_COUNT ThreadX objects in the registry. */ + if ((status = tx_trace_enable(tx_trace_buffer, TRACE_BUFFER_SIZE, TRACE_OBJECTS_COUNT)) != TX_SUCCESS) + { + while (1); + } + + /* Register thread stack error notification callback */ + if ((status = tx_thread_stack_error_notify(my_stack_error_handler)) != TX_SUCCESS) + { + while (1); + } + + /* Create a byte memory pool from which to allocate the thread stacks. */ + status = tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the main thread. */ + status = tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 1. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + status = tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 2. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 3. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + status = tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 4. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 5. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + status = tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 6. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + status = tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the stack for thread 7. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + status = tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the message queue. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the message queue shared by threads 1 and 2. */ + status = tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the semaphore used by threads 3 and 4. */ + status = tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the event flags group used by threads 1 and 5. */ + status = tx_event_flags_create(&event_flags_0, "event flags 0"); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + status = tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate the memory for a small block pool. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create a block memory pool to allocate a message buffer from. */ + status = tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Allocate a block and release the block memory. */ + status = tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Release the block back to the pool. */ + status = tx_block_release(pointer); + if (status != TX_SUCCESS) + { + while (1); + } + + /* Create the periodic timer. */ + status = tx_timer_create(&timer_0, "timer 0", my_timer_function, (ULONG) DEMO_TIMER_VALUE, DEMO_TIMER_PERIOD, DEMO_TIMER_PERIOD, TX_AUTO_ACTIVATE); + if (status != TX_SUCCESS) + { + while (1); + } +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void my_stack_error_handler(TX_THREAD *thread_ptr) +{ + while(1); +} + + +void my_timer_function(ULONG timer_input) +{ + /* Increment the thread counter. */ + timer_0_counter++; + + if (timer_input != DEMO_TIMER_VALUE) + while(1); +} + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd new file mode 100644 index 00000000..b03e87b5 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/sample_threadx.cmd @@ -0,0 +1,53 @@ +-c +-heap 0x400 +-stack 0x1000 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.ae66 +-l C:\ti\pdk_C6678_1_1_2_6\packages\ti\csl\lib\ti.csl.intc.ae66 + +/* Memory Map */ +MEMORY +{ + L1PSRAM (RWX) : org = 0x00E00000, len = 0x00008000 + L1DSRAM (RWX) : org = 0x00F00000, len = 0x00008000 + CODE_RAM (RWX) : org = 0x00800000, len = 0x00020000 + DATA_RAM (RWX) : org = 0x00820000, len = 0x00060000 + MSMCSRAM (RWX) : org = 0x0c000000, len = 0x00400000 + DDR3 (RWX) : org = 0x80000000, len = 0x80000000 +} + +SECTIONS +{ + .text > CODE_RAM + .stack > CODE_RAM + .cio > CODE_RAM + .const > CODE_RAM + .data > CODE_RAM + .switch > CODE_RAM + .sysmem > CODE_RAM + .far > CODE_RAM + .args > CODE_RAM + .ppinfo > CODE_RAM + .ppdata > CODE_RAM + .csl_vect > CODE_RAM + + GROUP + { + .neardata + .rodata + .bss + } > CODE_RAM + + /* COFF sections */ + .pinit > CODE_RAM + .cinit > CODE_RAM + + /* EABI sections */ + .binit > CODE_RAM + .init_array > CODE_RAM + .fardata > CODE_RAM + .c6xabi.exidx > CODE_RAM + .c6xabi.extab > CODE_RAM + + /* ThreadX section which should be the last RAM section loaded */ + .zend > DATA_RAM +} diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml new file mode 100644 index 00000000..b7147d7f --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/TMS320C6678.ccxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt new file mode 100644 index 00000000..d783fef4 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/targetConfigs/readme.txt @@ -0,0 +1,9 @@ +The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based +on the device and connection settings specified in your project on the Properties > General page. + +Please note that in automatic target-configuration management, changes to the project's device and/or +connection settings will either modify an existing or generate a new target-configuration file. Thus, +if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively, +you may create your own target-configuration file for this project and manage it manually. You can +always switch back to automatic target-configuration management by checking the "Manage the project's +target-configuration automatically" checkbox on the project's Properties > General page. \ No newline at end of file diff --git a/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm new file mode 100644 index 00000000..de902350 --- /dev/null +++ b/ports/c667x/ccs/example_build/sample_threadx_ta6678fmc/tx_initialize_low_level.asm @@ -0,0 +1,406 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + +SP .set B15 +ADDRESS_MSK .set 0xFFFFFFF0 ; Ensure 16-byte alignment + +; Use Timer 8 as it's available for all DSP cores at C6678 +; Timer 8 interrupt high event (TINT8H) ID is 67 +; Assume DSP core clock 1250 MHz +; Timer is clocked at DSP core clock / 6 = 208 MHz +; Timer frequency will set to 100 Hz +TMR8_INTCTLSTAT_ADDR .set 0x02280044 ; Timer 8 Interrupt Control and Status Register +INTCTLSTAT_VAL .set 0x00010000 ; Enable TIMHI interrupt + +EVTCLR2_ADDR .set 0x01800048 ; Event Clear register 2 address +EVTCLR2_TMR8_VAL .set 0x00000008 ; Clear event 67 - TINT8H + +EVTMASK2_ADDR .set 0x01800088 ; Event Mask register 2 address +EVTMASK2_TMR8_VAL .set 0x00000008 ; Mask event 67 - TINT8H + +INTMUX1_ADDR .set 0x01800104 ; Interrupt Mux Register 1 address +INTMUX1_TMR8_VAL .set 0x43 ; Tie in Event 67 (TINT8H) to INT4 +; +; + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + + +; External interrupt handlers - should be defined by user + .global tx_nmi_handler + .global tx_int5_handler + .global tx_int6_handler + .global tx_int7_handler + .global tx_int8_handler + .global tx_int9_handler + .global tx_int10_handler + .global tx_int11_handler + .global tx_int12_handler + .global tx_int13_handler + .global tx_int14_handler + .global tx_int15_handler + +; +; +;/* Define the first available address in memory, which is typically just the last +; RAM section loaded. */ + .sect ".zend" + .space 20 + .global _tx_first_free_memory + .align 16 +_tx_first_free_memory: + .space 4 + +; Useful macro definitions +; Load 32-bit integer into register +MVK_LH .macro val,reg + MVKL val,reg + MVKH val,reg + .endm +; Interrupt entry - allocate stack space, save A0-A4 and B3 registers to stack, +; build return address in B3 register for context save function and +; call context save function +TX_INTERRUPT_ENTRY .macro + ADDK.S2 -288,SP + STW B3,*+SP(96) + STW A0,*+SP(20) + STW A1,*+SP(24) + STW A2,*+SP(28) + STW A3,*+SP(32) + STW A4,*+SP(36) + B _tx_thread_context_save + .endm +; Interrupt exit - jump to context restore function +TX_INTERRUPT_EXIT .macro + B _tx_thread_context_restore + NOP 5 + .endm + + + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level C667x+/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + .global _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (SP); +; + MVK_LH _tx_thread_system_stack_ptr,A0 ; Build address of system stack + STW SP,*A0 ; Save system stack address +; +; /* Pickup the first available memory address. */ +; + MVK_LH ADDRESS_MSK,A0 ; Build address mask + MVK_LH _tx_first_free_memory,A1 ; Build address of free memory + AND A0,A1,A1 ; Ensure alignment +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) end; +; + MVK_LH _tx_initialize_unused_memory,A0 ; Build address of variable + STW A1,*A0 ; Save free memory address +; +; /* Setup Timer 8 HIGH interrupt event */ +; + MVK_LH INTMUX1_ADDR,A0 ; Select event 67 to send through INT4 + MVK_LH INTMUX1_TMR8_VAL,A1 + STW A1,*A0 + + MVK_LH EVTMASK2_ADDR,A0 ; Build address of Event Mask 2 Register + MVK_LH EVTMASK2_TMR8_VAL,A1 ; Build value of Event Mask 2 Register + STW A1,*A0 +; +; /* Done, return to caller. */ +; + B B3 ; Return to caller + NOP 5 ; Delay slots +;} +; + + + .global _tx_nmi_vector + .global _tx_nmi_vector_processing +_tx_nmi_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_nmi_vector_processing,B3 + MVKH _tx_nmi_vector_processing,B3 + NOP 3 +_tx_nmi_vector_processing: + CALLP tx_nmi_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int4_vector +_tx_int4_vector: + ADDK.S2 -288,SP ; Allocate stack space + STW B3,*+SP(96) ; Save B3 + STW A0,*+SP(20) ; Save A0 + STW A1,*+SP(24) ; Save A1 + STW A2,*+SP(28) ; Save A2 + STW A3,*+SP(32) ; Save A3 + STW A4,*+SP(36) ; Save A4 + NOP + +;_tx_timer_interrupt_preamble: + + MVK_LH TMR8_INTCTLSTAT_ADDR,A0 ; Build address of Timer Interrupt Control Register + MVK_LH INTCTLSTAT_VAL,A1 ; Build value of Timer Interrupt Control Register + STW A1,*A0 ; Clear Timer Interrupts + +; Clear DSP Event flag - DSP events are not self-cleared + MVK_LH EVTCLR2_ADDR,A0 ; Build address of Event Clear 2 Register + MVK_LH EVTCLR2_TMR8_VAL,A1 ; Build value of Event Clear 2 Register + STW A1,*A0 ; Clear Timer Event + + + MVK_LH _tx_timer_interrupt,A0 + B A0 ; Branch ThreadX timer ISR routine + NOP 5 ; Delay slots + NOP + + + + .global _tx_int5_vector + .global _tx_int5_vector_processing +_tx_int5_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int5_vector_processing,B3 + MVKH _tx_int5_vector_processing,B3 + NOP 3 +_tx_int5_vector_processing: + CALLP tx_int5_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int6_vector + .global _tx_int6_vector_processing +_tx_int6_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int6_vector_processing,B3 + MVKH _tx_int6_vector_processing,B3 + NOP 3 +_tx_int6_vector_processing: + CALLP tx_int6_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int7_vector + .global _tx_int7_vector_processing +_tx_int7_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int7_vector_processing,B3 + MVKH _tx_int7_vector_processing,B3 + NOP 3 +_tx_int7_vector_processing: + CALLP tx_int7_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int8_vector + .global _tx_int8_vector_processing +_tx_int8_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int8_vector_processing,B3 + MVKH _tx_int8_vector_processing,B3 + NOP 3 +_tx_int8_vector_processing: + CALLP tx_int8_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int9_vector + .global _tx_int9_vector_processing +_tx_int9_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int9_vector_processing,B3 + MVKH _tx_int9_vector_processing,B3 + NOP 3 +_tx_int9_vector_processing: + CALLP tx_int9_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int10_vector + .global _tx_int10_vector_processing +_tx_int10_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int10_vector_processing,B3 + MVKH _tx_int10_vector_processing,B3 + NOP 3 +_tx_int10_vector_processing: + CALLP tx_int10_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int11_vector + .global _tx_int11_vector_processing +_tx_int11_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int11_vector_processing,B3 + MVKH _tx_int11_vector_processing,B3 + NOP 3 +_tx_int11_vector_processing: + CALLP tx_int11_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int12_vector + .global _tx_int12_vector_processing +_tx_int12_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int12_vector_processing,B3 + MVKH _tx_int12_vector_processing,B3 + NOP 3 +_tx_int12_vector_processing: + CALLP tx_int12_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int13_vector + .global _tx_int13_vector_processing +_tx_int13_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int13_vector_processing,B3 + MVKH _tx_int13_vector_processing,B3 + NOP 3 +_tx_int13_vector_processing: + CALLP tx_int13_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int14_vector + .global _tx_int14_vector_processing +_tx_int14_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int14_vector_processing,B3 + MVKH _tx_int14_vector_processing,B3 + NOP 3 +_tx_int14_vector_processing: + CALLP tx_int14_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + + .global _tx_int15_vector + .global _tx_int15_vector_processing +_tx_int15_vector: + TX_INTERRUPT_ENTRY +; +; /* Application specific processing goes here! */ +; + MVKL _tx_int15_vector_processing,B3 + MVKH _tx_int15_vector_processing,B3 + NOP 3 +_tx_int15_vector_processing: + CALLP tx_int15_handler,B3 ; CALLP instruction should be used here to call handler and save return address to B3 + TX_INTERRUPT_EXIT + + diff --git a/ports/c667x/ccs/example_build/tx/.ccsproject b/ports/c667x/ccs/example_build/tx/.ccsproject new file mode 100644 index 00000000..bed925d4 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.ccsproject @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/tx/.cproject b/ports/c667x/ccs/example_build/tx/.cproject new file mode 100644 index 00000000..6fb6150d --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.cproject @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/c667x/ccs/example_build/tx/.project b/ports/c667x/ccs/example_build/tx/.project new file mode 100644 index 00000000..23e7d5ff --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.project @@ -0,0 +1,105 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + -k + + + org.eclipse.cdt.make.core.buildCommand + ${CCS_UTILS_DIR}/bin/gmake + + + org.eclipse.cdt.make.core.buildLocation + ${BuildDirectory} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + false + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.ti.ccstudio.core.ccsNature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..f653028c --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..d9be20e1 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Debug.832256006/append=true +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Debug.832256006/appendContributed=true +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Release.758214915/append=true +environment/project/com.ti.ccstudio.buildDefinitions.C6000.Release.758214915/appendContributed=true diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 00000000..2adc7b1d --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.toggleBreakpointModel=com.ti.ccstudio.debug.CCSBreakpointMarker diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 00000000..71fde590 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,6 @@ +#Fri Aug 03 15:02:35 PDT 2012 +com.ti.ccstudio.buildDefinitions.C6000.Debug.2070078368/internalBuilder/enabled=false +com.ti.ccstudio.buildDefinitions.C6000.Debug.2070078368/internalBuilder/ignoreErr=true +com.ti.ccstudio.buildDefinitions.C6000.Release.664540310/internalBuilder/enabled=false +com.ti.ccstudio.buildDefinitions.C6000.Release.664540310/internalBuilder/ignoreErr=true +eclipse.preferences.version=1 diff --git a/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..094412e7 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +encoding//Debug/makefile=UTF-8 +encoding//Debug/objects.mk=UTF-8 +encoding//Debug/sources.mk=UTF-8 +encoding//Debug/src_generic/subdir_rules.mk=UTF-8 +encoding//Debug/src_generic/subdir_vars.mk=UTF-8 +encoding//Debug/src_port/subdir_rules.mk=UTF-8 +encoding//Debug/src_port/subdir_vars.mk=UTF-8 +encoding//Debug/subdir_rules.mk=UTF-8 +encoding//Debug/subdir_vars.mk=UTF-8 +encoding//Release/makefile=UTF-8 +encoding//Release/objects.mk=UTF-8 +encoding//Release/sources.mk=UTF-8 +encoding//Release/subdir_rules.mk=UTF-8 +encoding//Release/subdir_vars.mk=UTF-8 diff --git a/ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt b/ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt new file mode 100644 index 00000000..e954d96e --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/ccsObjs.opt @@ -0,0 +1 @@ +"./tx_block_allocate.obj" "./tx_block_pool_cleanup.obj" "./tx_block_pool_create.obj" "./tx_block_pool_delete.obj" "./tx_block_pool_info_get.obj" "./tx_block_pool_initialize.obj" "./tx_block_pool_performance_info_get.obj" "./tx_block_pool_performance_system_info_get.obj" "./tx_block_pool_prioritize.obj" "./tx_block_release.obj" "./tx_byte_allocate.obj" "./tx_byte_pool_cleanup.obj" "./tx_byte_pool_create.obj" "./tx_byte_pool_delete.obj" "./tx_byte_pool_info_get.obj" "./tx_byte_pool_initialize.obj" "./tx_byte_pool_performance_info_get.obj" "./tx_byte_pool_performance_system_info_get.obj" "./tx_byte_pool_prioritize.obj" "./tx_byte_pool_search.obj" "./tx_byte_release.obj" "./tx_event_flags_cleanup.obj" "./tx_event_flags_create.obj" "./tx_event_flags_delete.obj" "./tx_event_flags_get.obj" "./tx_event_flags_info_get.obj" "./tx_event_flags_initialize.obj" "./tx_event_flags_performance_info_get.obj" "./tx_event_flags_performance_system_info_get.obj" "./tx_event_flags_set.obj" "./tx_event_flags_set_notify.obj" "./tx_initialize_high_level.obj" "./tx_initialize_kernel_enter.obj" "./tx_initialize_kernel_setup.obj" "./tx_mutex_cleanup.obj" "./tx_mutex_create.obj" "./tx_mutex_delete.obj" "./tx_mutex_get.obj" "./tx_mutex_info_get.obj" "./tx_mutex_initialize.obj" "./tx_mutex_performance_info_get.obj" "./tx_mutex_performance_system_info_get.obj" "./tx_mutex_prioritize.obj" "./tx_mutex_priority_change.obj" "./tx_mutex_put.obj" "./tx_queue_cleanup.obj" "./tx_queue_create.obj" "./tx_queue_delete.obj" "./tx_queue_flush.obj" "./tx_queue_front_send.obj" "./tx_queue_info_get.obj" "./tx_queue_initialize.obj" "./tx_queue_performance_info_get.obj" "./tx_queue_performance_system_info_get.obj" "./tx_queue_prioritize.obj" "./tx_queue_receive.obj" "./tx_queue_send.obj" "./tx_queue_send_notify.obj" "./tx_semaphore_ceiling_put.obj" "./tx_semaphore_cleanup.obj" "./tx_semaphore_create.obj" "./tx_semaphore_delete.obj" "./tx_semaphore_get.obj" "./tx_semaphore_info_get.obj" "./tx_semaphore_initialize.obj" "./tx_semaphore_performance_info_get.obj" "./tx_semaphore_performance_system_info_get.obj" "./tx_semaphore_prioritize.obj" "./tx_semaphore_put.obj" "./tx_semaphore_put_notify.obj" "./tx_thread_context_restore.obj" "./tx_thread_context_save.obj" "./tx_thread_create.obj" "./tx_thread_delete.obj" "./tx_thread_entry_exit_notify.obj" "./tx_thread_identify.obj" "./tx_thread_info_get.obj" "./tx_thread_initialize.obj" "./tx_thread_interrupt_control.obj" "./tx_thread_performance_info_get.obj" "./tx_thread_performance_system_info_get.obj" "./tx_thread_preemption_change.obj" "./tx_thread_priority_change.obj" "./tx_thread_relinquish.obj" "./tx_thread_reset.obj" "./tx_thread_resume.obj" "./tx_thread_schedule.obj" "./tx_thread_shell_entry.obj" "./tx_thread_sleep.obj" "./tx_thread_stack_analyze.obj" "./tx_thread_stack_build.obj" "./tx_thread_stack_error_handler.obj" "./tx_thread_stack_error_notify.obj" "./tx_thread_suspend.obj" "./tx_thread_system_preempt_check.obj" "./tx_thread_system_resume.obj" "./tx_thread_system_return.obj" "./tx_thread_system_suspend.obj" "./tx_thread_terminate.obj" "./tx_thread_time_slice.obj" "./tx_thread_time_slice_change.obj" "./tx_thread_timeout.obj" "./tx_thread_wait_abort.obj" "./tx_time_get.obj" "./tx_time_set.obj" "./tx_timer_activate.obj" "./tx_timer_change.obj" "./tx_timer_create.obj" "./tx_timer_deactivate.obj" "./tx_timer_delete.obj" "./tx_timer_expiration_process.obj" "./tx_timer_info_get.obj" "./tx_timer_initialize.obj" "./tx_timer_interrupt.obj" "./tx_timer_performance_info_get.obj" "./tx_timer_performance_system_info_get.obj" "./tx_timer_system_activate.obj" "./tx_timer_system_deactivate.obj" "./tx_timer_thread_entry.obj" "./tx_trace_buffer_full_notify.obj" "./tx_trace_disable.obj" "./tx_trace_enable.obj" "./tx_trace_event_filter.obj" "./tx_trace_event_unfilter.obj" "./tx_trace_initialize.obj" "./tx_trace_interrupt_control.obj" "./tx_trace_isr_enter_insert.obj" "./tx_trace_isr_exit_insert.obj" "./tx_trace_object_register.obj" "./tx_trace_object_unregister.obj" "./tx_trace_user_event_insert.obj" "./txe_block_allocate.obj" "./txe_block_pool_create.obj" "./txe_block_pool_delete.obj" "./txe_block_pool_info_get.obj" "./txe_block_pool_prioritize.obj" "./txe_block_release.obj" "./txe_byte_allocate.obj" "./txe_byte_pool_create.obj" "./txe_byte_pool_delete.obj" "./txe_byte_pool_info_get.obj" "./txe_byte_pool_prioritize.obj" "./txe_byte_release.obj" "./txe_event_flags_create.obj" "./txe_event_flags_delete.obj" "./txe_event_flags_get.obj" "./txe_event_flags_info_get.obj" "./txe_event_flags_set.obj" "./txe_event_flags_set_notify.obj" "./txe_mutex_create.obj" "./txe_mutex_delete.obj" "./txe_mutex_get.obj" "./txe_mutex_info_get.obj" "./txe_mutex_prioritize.obj" "./txe_mutex_put.obj" "./txe_queue_create.obj" "./txe_queue_delete.obj" "./txe_queue_flush.obj" "./txe_queue_front_send.obj" "./txe_queue_info_get.obj" "./txe_queue_prioritize.obj" "./txe_queue_receive.obj" "./txe_queue_send.obj" "./txe_queue_send_notify.obj" "./txe_semaphore_ceiling_put.obj" "./txe_semaphore_create.obj" "./txe_semaphore_delete.obj" "./txe_semaphore_get.obj" "./txe_semaphore_info_get.obj" "./txe_semaphore_prioritize.obj" "./txe_semaphore_put.obj" "./txe_semaphore_put_notify.obj" "./txe_thread_create.obj" "./txe_thread_delete.obj" "./txe_thread_entry_exit_notify.obj" "./txe_thread_info_get.obj" "./txe_thread_preemption_change.obj" "./txe_thread_priority_change.obj" "./txe_thread_relinquish.obj" "./txe_thread_reset.obj" "./txe_thread_resume.obj" "./txe_thread_suspend.obj" "./txe_thread_terminate.obj" "./txe_thread_time_slice_change.obj" "./txe_thread_wait_abort.obj" "./txe_timer_activate.obj" "./txe_timer_change.obj" "./txe_timer_create.obj" "./txe_timer_deactivate.obj" "./txe_timer_delete.obj" "./txe_timer_info_get.obj" \ No newline at end of file diff --git a/ports/c667x/ccs/example_build/tx/Release/objects.mk b/ports/c667x/ccs/example_build/tx/Release/objects.mk new file mode 100644 index 00000000..742c2da0 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := + diff --git a/ports/c667x/ccs/example_build/tx/Release/sources.mk b/ports/c667x/ccs/example_build/tx/Release/sources.mk new file mode 100644 index 00000000..9cbc2a26 --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/sources.mk @@ -0,0 +1,110 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C55_SRCS := +A_SRCS := +ASM_UPPER_SRCS := +LDS_UPPER_SRCS := +CPP_SRCS := +CMD_SRCS := +O_SRCS := +C??_SRCS := +C64_SRCS := +C67_SRCS := +SA_SRCS := +S64_SRCS := +OPT_SRCS := +CXX_SRCS := +S67_SRCS := +S??_SRCS := +PDE_SRCS := +SV7A_SRCS := +K_SRCS := +CLA_SRCS := +S55_SRCS := +LD_UPPER_SRCS := +INO_SRCS := +LIB_SRCS := +ASM_SRCS := +S_UPPER_SRCS := +S43_SRCS := +LD_SRCS := +CMD_UPPER_SRCS := +C_UPPER_SRCS := +C++_SRCS := +C43_SRCS := +OBJ_SRCS := +LDS_SRCS := +S_SRCS := +CC_SRCS := +S62_SRCS := +C62_SRCS := +C_SRCS := +C55_DEPS := +C_UPPER_DEPS := +S67_DEPS := +S62_DEPS := +S_DEPS := +OPT_DEPS := +C??_DEPS := +ASM_UPPER_DEPS := +S??_DEPS := +C64_DEPS := +CXX_DEPS := +S64_DEPS := +INO_DEPS := +CLA_DEPS := +S55_DEPS := +SV7A_DEPS := +C62_DEPS := +C67_DEPS := +PDE_DEPS := +K_DEPS := +C_DEPS := +LIB_OUTPUTS := +CC_DEPS := +C++_DEPS := +C43_DEPS := +S43_DEPS := +OBJS := +ASM_DEPS := +S_UPPER_DEPS := +CPP_DEPS := +SA_DEPS := +C++_DEPS__QUOTED := +OPT_DEPS__QUOTED := +S_UPPER_DEPS__QUOTED := +SA_DEPS__QUOTED := +C??_DEPS__QUOTED := +S67_DEPS__QUOTED := +C55_DEPS__QUOTED := +CC_DEPS__QUOTED := +ASM_UPPER_DEPS__QUOTED := +SV7A_DEPS__QUOTED := +S??_DEPS__QUOTED := +OBJS__QUOTED := +C67_DEPS__QUOTED := +LIB_OUTPUTS__QUOTED := +K_DEPS__QUOTED := +S55_DEPS__QUOTED := +INO_DEPS__QUOTED := +C62_DEPS__QUOTED := +C_DEPS__QUOTED := +C_UPPER_DEPS__QUOTED := +C43_DEPS__QUOTED := +CPP_DEPS__QUOTED := +C64_DEPS__QUOTED := +CXX_DEPS__QUOTED := +CLA_DEPS__QUOTED := +S_DEPS__QUOTED := +ASM_DEPS__QUOTED := +S43_DEPS__QUOTED := +S64_DEPS__QUOTED := +S62_DEPS__QUOTED := +PDE_DEPS__QUOTED := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ + diff --git a/ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk b/ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk new file mode 100644 index 00000000..6ceea2dd --- /dev/null +++ b/ports/c667x/ccs/example_build/tx/Release/subdir_rules.mk @@ -0,0 +1,22 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL = cmd.exe + +# Each subdirectory must supply rules for building sources it contributes +%.obj: ../%.c $(GEN_OPTS) | $(GEN_FILES) + @echo 'Building file: "$<"' + @echo 'Invoking: C6000 Compiler' + "C:/ti/ccsv8/tools/compiler/ti-cgt-c6000_8.2.4/bin/cl6x" -mv6600 --abi=eabi -O2 --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-c6000_8.2.4/include" --display_error_number --diag_warning=225 --preproc_with_compile --preproc_dependency="$(basename $( +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef int LONG; +typedef unsigned int ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 400 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 2048 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX C6xxx port. */ + +#define TX_INT_DISABLE 0x00 /* Disable interrupts */ +#define TX_INT_ENABLE 0x01 /* Enable interrupts */ + + +#ifndef TX_TIMER_TICKS_PER_SECOND +#define TX_TIMER_TICKS_PER_SECOND ((ULONG) 100) +#endif + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ +/* +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x01f0c014) +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif +*/ + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION +/* +#define TX_TIMER_INTERNAL_EXTENSION ULONG tx_timer_internal_padding; +*/ + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#ifdef TX_SKIP_INTRINSICS +unsigned int _tx_thread_interrupt_control(unsigned int); + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_control(TX_INT_DISABLE); +#define TX_RESTORE _tx_thread_interrupt_control(interrupt_save); +#else +#define TX_DISABLE interrupt_save = _disable_interrupts(); +#define TX_RESTORE _restore_interrupts(interrupt_save); +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX C667x/TI Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + diff --git a/ports/c667x/ccs/readme_threadx.txt b/ports/c667x/ccs/readme_threadx.txt new file mode 100644 index 00000000..d78707c7 --- /dev/null +++ b/ports/c667x/ccs/readme_threadx.txt @@ -0,0 +1,248 @@ + Microsoft's Azure RTOS ThreadX for TMS320C667x + + Using the TI Code Composer Tools + +1. Installation + +TI Code Composer Studio and the TI MCSDK must be installed prior to +building ThreadX. The following links can be used to download these +packages: + + +http://processors.wiki.ti.com/index.php/Download_CCS +http://software-dl.ti.com/sdoemb/sdoemb_public_sw/bios_mcsdk/latest/index_FDS.html + +It is assumed the tools are installed in the default directories: + +CCS path by default - c:\ti\ccsv(version number) +MCSDK path by default - c:\ti + +If the packages are installed in different directories, the ThreadX project +settings must be adjusted. + +2. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first open +the Azure RTOS Workspace inside your ThreadX installation directory. + + +3. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply import the CCS project file +"tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.lib. + + +4. Demonstration System + +The ThreadX demonstration is designed to execute on the C6678EVM evaluation board. + +Building the demonstration is easy; simply import the "sample_threadx_c6678evm" project. +Now select "Project -> Build Active Project" to build the ThreadX demonstration, +which produces the sample_threadx.out file in the "Debug" directory. You are now +ready to run the ThreadX demonstration on the C6678EVM evaluation board. + +Please refer to Chapter 6 of the ThreadX User Guide for a complete description +of this demonstration. + + +5. System Initialization + +The entry point in ThreadX for the TMS320C667x using the TI tools is at label +_c_int00. This is defined within the TI library. In addition, this is +where all static and global pre-set C variable initialization processing +takes place. + +The ThreadX initialization file tx_initialize_low_level.asm is responsible +for setting up various system data structures, the vector area, and a periodic +timer interrupt source. By default, the vector area is defined to be located in +the "vectors" section, which is defined at the top of tx_initialize_low_level.asm. +This area is located at address 0 for the demonstration. + +tx_initialize_low_level.asm is also where initialization of a periodic timer +interrupt source should take place. + +In addition, _tx_initialize_low_level determines the first available address +for use by the application. By default, free memory is assumed to start after +the .zend section in RAM (defined in tx_initialize_low_level). This section +must be placed at the end of your other RAM sections. Please see sample_threadx.cmd +for an example. The address of this section is passed to the application definition +function, tx_application_define. + + +6. Register Usage and Stack Frames + +The TI TMS320C667x compiler assumes that registers A0-A9, A16-A31, B0-B9, and +B16-B31 are scratch registers for each function. All other registers used by +a C function must be preserved by the function. ThreadX takes advantage of this +in situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved context +of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x04 1 0 + 0x08 CSR CSR + 0x0C IPR B3 + 0x10 AMR AMR + 0x14 A0 A10 + 0x18 A1 A11 + 0x1C A2 A12 + 0x20 A3 A13 + 0x24 A4 A14 + 0x28 A5 A15 + 0x2C A6 B10 + 0x30 A7 B11 + 0x34 A8 B12 + 0x38 A9 B13 + 0x3C A10 ILC + 0x40 A11 RILC + 0x44 A12 + 0x48 A13 + 0x4C A14 + 0x50 A15 + 0x54 B0 + 0x58 B1 + 0x5C B2 + 0x60 B3 + 0x64 B4 + 0x68 B5 + 0x6C B6 + 0x70 B7 + 0x74 B8 + 0x78 B9 + 0x7C B10 + 0x80 B11 + 0x84 B12 + 0x88 B13 + 0x8C A16 + 0x90 A17 + 0x94 A18 + 0x98 A19 + 0x9C A20 + 0xA0 A21 + 0xA4 A22 + 0xA8 A23 + 0xAC A24 + 0xB0 A25 + 0xB4 A26 + 0xB8 A27 + 0xBC A28 + 0xC0 A29 + 0xC4 A30 + 0xC8 A31 + 0xCC B16 + 0xD0 B17 + 0xD4 B18 + 0xD8 B19 + 0xDC B20 + 0xE0 B21 + 0xE4 B22 + 0xE8 B23 + 0xEC B24 + 0xF0 B25 + 0xF4 B26 + 0xF8 B27 + 0xFC B28 + 0x100 B29 + 0x104 B30 + 0x108 B31 + 0x10C ILC + 0x110 RILC + 0x114 ITSR + + +7. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some performance. +To make it run faster, you can replace the -g compiler option +to a -O3 in the ThreadX project file to enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +8. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for +TMS320C667x targets. There are a certain set of requirements that are +defined in the following sub-sections: + + +8.1 Vector Area + +The TMS320C667x interrupt vectors at in the section "vectors" and is defined at +the top of tx_initialize_low_level.asm. Each interrupt vector entry contains +a jump to a template interrupt processing shell. + + +8.2 Interrupt Service Routine Shells + +The following interrupt processing shells are defined at the bottom of +tx_initialize_low_level.asm: + + + __tx_int4_ISR + __tx_int5_ISR + __tx_int6_ISR + __tx_int7_ISR + __tx_int8_ISR + __tx_int9_ISR + __tx_int10_ISR + __tx_int11_ISR + __tx_int12_ISR + __tx_int13_ISR + __tx_int14_ISR + __tx_int15_ISR + +Each interrupt ISR is entered with B3, A0-A4 is available (these registers are +saved in the initial vector processing). The default interrupt handling +includes calls to __tx_thread_context_save and __tx_thread_context_restore. +Application ISR processing can be added between the context save/restore +calls. Note that only the compiler scratch registers are available for use +after context save return to the ISR. + +High-frequency interrupt handlers might not want to perform context +save/restore processing on each interrupt. If this is the case, any +additional registers used must be saved and restored by the ISR and +the interrupt return processing must restore the registers saved by the +initial vector processing. This can be accomplished by adding the +following code to the end of the custom ISR handling: + + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + B IRP ; Return to point of interrupt +|| LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for TMS320C667x using TI Code Composer tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/c667x/ccs/src/tx_thread_context_restore.asm b/ports/c667x/ccs/src/tx_thread_context_restore.asm new file mode 100644 index 00000000..58861b58 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_context_restore.asm @@ -0,0 +1,343 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + .global _tx_thread_context_restore +_tx_thread_context_restore: +; +; /* Lockout interrupts. */ +; + MVC CSR,B0 ; Pickup CSR + AND -2,B0,B0 ; Build interrupt lockout value + MVC B0,CSR ; Lockout interrupts +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + MVKL _tx_thread_system_state,A0 ; Build address of system state + MVKH _tx_thread_system_state,A0 ; + LDW *A0,A1 ; Pickup system state variable + MVKL _tx_thread_current_ptr,A2 ; Build address of current thread ptr + NOP 3 ; Delay slots + SUB A1,1,A1 ; Decrement system state + [!A1] B _tx_thread_not_nested_restore ; If 0, not a nested restore + MVKH _tx_thread_current_ptr,A2 ; + LDW *A2,A3 ; Pickup current thread pointer + STW A1,*A0 ; Store system state + NOP 2 ; Delay slots +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDW *+SP(8),B0 ; Recover saved CSR + LDW *+SP(12),B1 ; Recover saved IRP + LDW *+SP(16),B2 ; Recover saved AMR + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(40),A5 ; Recover A5 + LDW *+SP(44),A6 ; Recover A6 + LDW *+SP(48),A7 ; Recover A7 + LDW *+SP(52),A8 ; Recover A8 + LDW *+SP(56),A9 ; Recover A9 + MVC B0,CSR ; Setup CSR + MVC B1,IRP ; Setup IRP + MVC B2,AMR ; Setup AMR + LDW *+SP(268),B0 ; Recover saved ILC + LDW *+SP(272),B1 ; Recover saved RILC + LDW *+SP(276),B2 ; Recover saved ITSR + NOP 4 + MVC B0,ILC ; Setup ILC + MVC B1,RILC ; Setup RILC + MVC B2,ITSR ; Setup ITSR + LDW *+SP(84),B0 ; Recover B0 + LDW *+SP(88),B1 ; Recover B1 + LDW *+SP(92),B2 ; Recover B2 + LDW *+SP(100),B4 ; Recover B4 + LDW *+SP(104),B5 ; Recover B5 + LDW *+SP(108),B6 ; Recover B6 + LDW *+SP(112),B7 ; Recover B7 + LDW *+SP(116),B8 ; Recover B8 + LDW *+SP(140),A16 ; Recover A16 + LDW *+SP(144),A17 ; Recover A17 + LDW *+SP(148),A18 ; Recover A18 + LDW *+SP(152),A19 ; Recover A19 + LDW *+SP(156),A20 ; Recover A20 + LDW *+SP(160),A21 ; Recover A21 + LDW *+SP(164),A22 ; Recover A22 + LDW *+SP(168),A23 ; Recover A23 + LDW *+SP(172),A24 ; Recover A24 + LDW *+SP(176),A25 ; Recover A25 + LDW *+SP(180),A26 ; Recover A26 + LDW *+SP(184),A27 ; Recover A27 + LDW *+SP(188),A28 ; Recover A28 + LDW *+SP(192),A29 ; Recover A29 + LDW *+SP(196),A30 ; Recover A30 + LDW *+SP(200),A31 ; Recover A31 + LDW *+SP(204),B16 ; Recover B16 + LDW *+SP(208),B17 ; Recover B17 + LDW *+SP(212),B18 ; Recover B18 + LDW *+SP(216),B19 ; Recover B19 + LDW *+SP(220),B20 ; Recover B20 + LDW *+SP(224),B21 ; Recover B21 + LDW *+SP(228),B22 ; Recover B22 + LDW *+SP(232),B23 ; Recover B23 + LDW *+SP(236),B24 ; Recover B24 + LDW *+SP(240),B25 ; Recover B25 + LDW *+SP(244),B26 ; Recover B26 + LDW *+SP(248),B27 ; Recover B27 + LDW *+SP(252),B28 ; Recover B28 + LDW *+SP(256),B29 ; Recover B29 + LDW *+SP(260),B30 ; Recover B30 + LDW *+SP(264),B31 ; Recover B31 + B IRP ; Return to point of interrupt +|| LDW *+SP(120),B9 ; Recover B9 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +; } +_tx_thread_not_nested_restore: +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + NOP ; Delay + MV A3,A1 ; Move thread pointer into A1 + [!A1] B _tx_thread_schedule ; If null, idle system restore + MVKL _tx_thread_preempt_disable,A0 ; Build preempt disable flag address + MVKH _tx_thread_preempt_disable,A0 ; + MVKL _tx_thread_execute_ptr,A4 ; Build execute thread pointer + MVKH _tx_thread_execute_ptr,A4 ; + LDW *A0,B1 ; Pickup preempt disable flag + + LDW *A4,A6 ; Pickup next thread to execute + NOP 4 ; Delay slot + CMPEQ A6,A1,A7 ; Determine if threads are the same? + ADD A7,B1,B1 ; Add results together + [B1] B _tx_thread_no_preempt_restore ; If set, skip preeemption + LDW *+A1(8),A6 ; Recover thread's stack pointer + MVKL _tx_timer_time_slice,A5 ; Build time slice address + MVKH _tx_timer_time_slice,A5 ; + LDW *A5,B1 ; Pickup current time-slice + NOP ; Delay slot +; +; +_tx_thread_preempt_restore: +; +; + MVKL 1,A0 ; Build the interrupt stack type + STW A0,*+A6(4) ; Save stack type +; +; /* Store the remaining registers on the thread's stack. */ +; + STW A10,*+A6(60) ; Save A10 + STW A11,*+A6(64) ; Save A11 + STW A12,*+A6(68) ; Save A12 + STW A13,*+A6(72) ; Save A13 + STW A14,*+A6(76) ; Save A14 + STW A15,*+A6(80) ; Save A15 (FP) + STW B10,*+A6(124) ; Save B10 + ADDK 128,A6 ; Move stack pointer + STW B11,*+A6(0) ; Save B11 + STW B12,*+A6(4) ; Save B12 + STW B13,*+A6(8) ; Save B13 +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; +; } +_tx_thread_dont_save_ts: +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler + STW B1,*+A1(24) ; Store current time-slice + ZERO A3 ; Clear value + STW A3,*A2 ; Set current thread pointer to NULL + STW A3,*A5 ; Set time slice to 0 + NOP ; Delay +; +; +_tx_thread_no_preempt_restore: +; +; /* Restore interrupted thread. */ +; +; /* Pickup the saved stack pointer. */ +; SP = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + MV A6,SP ; Setup real stack pointer + LDW *+SP(8),B0 ; Recover saved CSR + LDW *+SP(12),B1 ; Recover saved IRP + LDW *+SP(16),B2 ; Recover saved AMR + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(40),A5 ; Recover A5 + LDW *+SP(44),A6 ; Recover A6 + LDW *+SP(48),A7 ; Recover A7 + LDW *+SP(52),A8 ; Recover A8 + LDW *+SP(56),A9 ; Recover A9 + MVC B0,CSR ; Setup CSR + MVC B1,IRP ; Setup IRP + MVC B2,AMR ; Setup AMR + LDW *+SP(268),B0 ; Recover saved ILC + LDW *+SP(272),B1 ; Recover saved RILC + LDW *+SP(276),B2 ; Recover saved ITSR + NOP 4 ; Delay + MVC B0,ILC ; Setup ILC + MVC B1,RILC ; Setup RILC + MVC B2,ITSR ; Setup ITSR + LDW *+SP(84),B0 ; Recover B0 + LDW *+SP(88),B1 ; Recover B1 + LDW *+SP(92),B2 ; Recover B2 + LDW *+SP(100),B4 ; Recover B4 + LDW *+SP(104),B5 ; Recover B5 + LDW *+SP(108),B6 ; Recover B6 + LDW *+SP(112),B7 ; Recover B7 + LDW *+SP(116),B8 ; Recover B8 + LDW *+SP(140),A16 ; Recover A16 + LDW *+SP(144),A17 ; Recover A17 + LDW *+SP(148),A18 ; Recover A18 + LDW *+SP(152),A19 ; Recover A19 + LDW *+SP(156),A20 ; Recover A20 + LDW *+SP(160),A21 ; Recover A21 + LDW *+SP(164),A22 ; Recover A22 + LDW *+SP(168),A23 ; Recover A23 + LDW *+SP(172),A24 ; Recover A24 + LDW *+SP(176),A25 ; Recover A25 + LDW *+SP(180),A26 ; Recover A26 + LDW *+SP(184),A27 ; Recover A27 + LDW *+SP(188),A28 ; Recover A28 + LDW *+SP(192),A29 ; Recover A29 + LDW *+SP(196),A30 ; Recover A30 + LDW *+SP(200),A31 ; Recover A31 + LDW *+SP(204),B16 ; Recover B16 + LDW *+SP(208),B17 ; Recover B17 + LDW *+SP(212),B18 ; Recover B18 + LDW *+SP(216),B19 ; Recover B19 + LDW *+SP(220),B20 ; Recover B20 + LDW *+SP(224),B21 ; Recover B21 + LDW *+SP(228),B22 ; Recover B22 + LDW *+SP(232),B23 ; Recover B23 + LDW *+SP(236),B24 ; Recover B24 + LDW *+SP(240),B25 ; Recover B25 + LDW *+SP(244),B26 ; Recover B26 + LDW *+SP(248),B27 ; Recover B27 + LDW *+SP(252),B28 ; Recover B28 + LDW *+SP(256),B29 ; Recover B29 + LDW *+SP(260),B30 ; Recover B30 + LDW *+SP(264),B31 ; Recover B31 + B IRP ; Return to point of interrupt +|| LDW *+SP(120),B9 ; Recover B9 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +; } +;} + diff --git a/ports/c667x/ccs/src/tx_thread_context_save.asm b/ports/c667x/ccs/src/tx_thread_context_save.asm new file mode 100644 index 00000000..ea455f8f --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_context_save.asm @@ -0,0 +1,274 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + .global _tx_thread_context_save +_tx_thread_context_save: +; +; /* Upon entry to this routine, it is assumed that all interrupts are locked +; out, an initial stack frame of 288 bytes has been allocated and registers +; A0, A1, A2, A3, A4, and B3 have been saved in the frame. Additionally, +; it is assumed that register B3 contains the ISR's return address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + MVKL _tx_thread_system_state,A0 ; Build address of system state + MVKH _tx_thread_system_state,A0 ; + LDW *A0,A1 ; Pickup current system state + STW A5,*+SP(40) ; Save A5 + STW A6,*+SP(44) ; Save A6 + STW A7,*+SP(48) ; Save A7 + STW A8,*+SP(52) ; Save A8 + [!A1] B _tx_thread_not_nested_save ; If 0, not a nested save condition + MVKL _tx_thread_current_ptr,A3 ; Build address of current thread ptr + MVKH _tx_thread_current_ptr,A3 ; + LDW *A3,A2 ; Pickup current thread pointer + ADD 1,A1,A1 ; Increment the system state (nested) counter + STW A1,*A0 ; Store system state +; +; /* Nested interrupt condition. Save remaining scratch registers, and control registers +; and return to calling ISR. */ +; + STW A9,*+SP(56) ; Save A9 + STW B0,*+SP(84) ; Save B0 + STW B1,*+SP(88) ; Save B1 + STW B2,*+SP(92) ; Save B2 + ; B3 is already saved! + STW B4,*+SP(100) ; Save B4 + STW B5,*+SP(104) ; Save B5 + STW B6,*+SP(108) ; Save B6 + STW B7,*+SP(112) ; Save B7 + STW B8,*+SP(116) ; Save B8 + STW B9,*+SP(120) ; Save B9 + MVC CSR,B0 ; Pickup CSR + B B3 ; Return to calling ISR + MVC IRP,B1 ; Pickup IRP + MVC AMR,B2 ; Pickup AMR + STW B0,*+SP(8) ; Save CSR + STW B1,*+SP(12) ; Save IRP + STW B2,*+SP(16) ; Save AMR + ZERO B0 ; Clear B0 + MVC B0,AMR ; Clear AMR for linear addressing in ISR + STW A16,*+SP(140) ; Save A16 + STW A17,*+SP(144) ; Save A17 + STW A18,*+SP(148) ; Save A18 + STW A19,*+SP(152) ; Save A19 + STW A20,*+SP(156) ; Save A20 + STW A21,*+SP(160) ; Save A21 + STW A22,*+SP(164) ; Save A22 + STW A23,*+SP(168) ; Save A23 + STW A24,*+SP(172) ; Save A24 + STW A25,*+SP(176) ; Save A25 + STW A26,*+SP(180) ; Save A26 + STW A27,*+SP(184) ; Save A27 + STW A28,*+SP(188) ; Save A28 + STW A29,*+SP(192) ; Save A29 + STW A30,*+SP(196) ; Save A30 + STW A31,*+SP(200) ; Save A31 + STW B16,*+SP(204) ; Save B16 + STW B17,*+SP(208) ; Save B17 + STW B18,*+SP(212) ; Save B18 + STW B19,*+SP(216) ; Save B19 + STW B20,*+SP(220) ; Save B20 + STW B21,*+SP(224) ; Save B21 + STW B22,*+SP(228) ; Save B22 + STW B23,*+SP(232) ; Save B23 + STW B24,*+SP(236) ; Save B24 + STW B25,*+SP(240) ; Save B25 + STW B26,*+SP(244) ; Save B26 + STW B27,*+SP(248) ; Save B27 + STW B28,*+SP(252) ; Save B28 + STW B29,*+SP(256) ; Save B29 + STW B30,*+SP(260) ; Save B30 + STW B31,*+SP(264) ; Save B31 + MVC ILC,B0 ; Pickup ILC + MVC RILC,B1 ; Pickup RILC + MVC ITSR,B2 ; Pickup ITSR + STW B0,*+SP(268) ; Save ILC + STW B1,*+SP(272) ; Save RILC + STW B2,*+SP(276) ; Save ITSR +; +_tx_thread_not_nested_save: +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + MVKL _tx_thread_system_stack_ptr,A0 ; Build address of system + MVKH _tx_thread_system_stack_ptr,A0 ; stack pointer + MV A2,A1 ; Transfer to A1 for B compare + [!A1] B _tx_thread_idle_system_save ; If Null, idle system save + STW A9,*+SP(56) ; Save A9 + STW B0,*+SP(84) ; Save B0 + STW B1,*+SP(88) ; Save B1 + STW B2,*+SP(92) ; Save B2 + NOP ; Delay slot +; +; /* At this point, a thread was interrupted and the remainder of its scratch and +; control registers must be saved. */ +; + ; B3 was already saved! + STW B4,*+SP(100) ; Save B4 + STW B5,*+SP(104) ; Save B5 + STW B6,*+SP(108) ; Save B6 + STW B7,*+SP(112) ; Save B7 + STW B8,*+SP(116) ; Save B8 + STW B9,*+SP(120) ; Save B9 + MVC CSR,B0 ; Pickup CSR + MVC IRP,B1 ; Pickup IRP + MVC AMR,B2 ; Pickup AMR + STW B0,*+SP(8) ; Save CSR + STW B1,*+SP(12) ; Save IRP + STW B2,*+SP(16) ; Save AMR + ZERO B0 ; Clear B0 + MVC B0,AMR ; Clear AMR for linear addressing in ISR + STW A16,*+SP(140) ; Save A16 + STW A17,*+SP(144) ; Save A17 + STW A18,*+SP(148) ; Save A18 + STW A19,*+SP(152) ; Save A19 + STW A20,*+SP(156) ; Save A20 + STW A21,*+SP(160) ; Save A21 + STW A22,*+SP(164) ; Save A22 + STW A23,*+SP(168) ; Save A23 + STW A24,*+SP(172) ; Save A24 + STW A25,*+SP(176) ; Save A25 + STW A26,*+SP(180) ; Save A26 + STW A27,*+SP(184) ; Save A27 + STW A28,*+SP(188) ; Save A28 + STW A29,*+SP(192) ; Save A29 + STW A30,*+SP(196) ; Save A30 + STW A31,*+SP(200) ; Save A31 + STW B16,*+SP(204) ; Save B16 + STW B17,*+SP(208) ; Save B17 + STW B18,*+SP(212) ; Save B18 + STW B19,*+SP(216) ; Save B19 + STW B20,*+SP(220) ; Save B20 + STW B21,*+SP(224) ; Save B21 + STW B22,*+SP(228) ; Save B22 + STW B23,*+SP(232) ; Save B23 + STW B24,*+SP(236) ; Save B24 + STW B25,*+SP(240) ; Save B25 + STW B26,*+SP(244) ; Save B26 + STW B27,*+SP(248) ; Save B27 + STW B28,*+SP(252) ; Save B28 + STW B29,*+SP(256) ; Save B29 + STW B30,*+SP(260) ; Save B30 + STW B31,*+SP(264) ; Save B31 + MVC ILC,B0 ; Pickup ILC + MVC RILC,B1 ; Pickup RILC + MVC ITSR,B2 ; Pickup ITSR + STW B0,*+SP(268) ; Save ILC + STW B1,*+SP(272) ; Save RILC + STW B2,*+SP(276) ; Save ITSR +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = SP; +; +; /* Switch to the system stack. */ +; SP = _tx_thread_system_stack_ptr; +; + STW SP,*+A1(8) ; Save stack pointer + B B3 ; Return to calling ISR + LDW *A0,SP ; Switch to system stack + NOP 4 ; Stack pointer is valid upon return! +; +; } +; else +; { +; +_tx_thread_idle_system_save: +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to ISR +; processing. */ +; + B B3 ; Return to ISR + ADDK.S2 288,SP ; Recover stack space + NOP 4 ; Delay slot +; +; } +;} + diff --git a/ports/c667x/ccs/src/tx_thread_interrupt_control.asm b/ports/c667x/ccs/src/tx_thread_interrupt_control.asm new file mode 100644 index 00000000..ac7d467d --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_interrupt_control.asm @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FP .set A15 +DP .set B14 +SP .set B15 +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + .global _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MVC CSR,B0 ; Pickup current CSR +; +; /* Apply the new interrupt posture. */ +; + B B3 ; Return to caller + AND -2,B0,B0 ; Clear GIE bit + OR A4,B0,B0 ; Build new interrupt posture + MVC CSR,B1 ; Return previous posture + MVC B0,CSR ; Apply new interrupt posture + AND 1,B1,A4 ; Clear non-GIE bits +; +;} + diff --git a/ports/c667x/ccs/src/tx_thread_schedule.asm b/ports/c667x/ccs/src/tx_thread_schedule.asm new file mode 100644 index 00000000..57da66d1 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_schedule.asm @@ -0,0 +1,254 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; +; + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + .global _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MVC CSR,B0 ; Pickup current CSR + OR 1,B0,B0 ; Build interrupt enable value + MVC B0,CSR ; Enable interrupts + MVKL _tx_thread_execute_ptr,A0 ; Build address of execute pointer + MVKH _tx_thread_execute_ptr,A0 ; +; +; /* Wait for a thread to execute. */ +; do +; { +; +_tx_thread_schedule_loop: +; + LDW *A0,A1 ; Pickup next thread to execute + NOP 4 ; Delay slots + [!A1] B _tx_thread_schedule_loop ; If Null, just wait here for thread + ; to become ready + MV A1,A4 ; Move thread pointer to A4 + MVKL _tx_thread_current_ptr,A1 ; Build address of current thread ptr + MVKH _tx_thread_current_ptr,A1 ; + MVKL _tx_timer_time_slice,A2 ; Build address of time-slice + MVKH _tx_timer_time_slice,A2 ; +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + AND -2,B0,B0 ; Build interrupt lockout value + MVC B0,CSR ; Lockout interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDW *+A4(4),A3 ; Pickup run-count + LDW *+A4(8),SP ; Switch to thread's stack + LDW *+A4(24),B1 ; Pickup time-slice + STW A4,*A1 ; Setup current pointer + NOP ; Delay +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + ADD 1,A3,A3 ; Increment run-counter + LDW *+SP(4),B0 ; Pickup stack-type + STW A3,*+A4(4) ; Store run-counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + STW B1,*A2 ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; SP = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + NOP 2 ; Delay slots + [B0] B _tx_thread_interrupt_stack ; Look for interrupt stack frame + LDW *+SP(8),B0 ; Pickup saved CSR + LDW *+SP(12),B3 ; Pickup saved B3/IPR + LDW *+SP(16),B1 ; Pickup saved AMR + LDW *+SP(20),A10 ; Restore A10 + LDW *+SP(24),A11 ; Restore A11 + LDW *+SP(28),A12 ; Restore A12 + LDW *+SP(32),A13 ; Restore A13 + MVC B0,CSR ; Restore CSR + MVC B1,AMR ; Restore AMR + LDW *+SP(36),A14 ; Restore A14 + LDW *+SP(40),A15 ; Restore A15 + LDW *+SP(44),B10 ; Restore B10 + LDW *+SP(48),B11 ; Restore B11 + LDW *+SP(52),B12 ; Restore B12 + LDW *+SP(56),B13 ; Restore B13 + LDW *+SP(60),B0 ; Restore ILC + LDW *+SP(64),B1 ; Restore RILC + NOP 4 ; Delay slots + MVC B0,ILC ; Restore ILC + MVC B1,RILC ; Restore RILC + B B3 ; Return to caller + ADDK 64,SP ; Recover stack space + NOP 4 ; Delay slots +; +_tx_thread_interrupt_stack: + MVC B0,CSR ; Restore CSR + MVC B3,IRP ; Restore IPR + MVC B1,AMR ; Restore AMR + LDW *+SP(268),B0 ; Recover saved ILC + LDW *+SP(272),B1 ; Recover saved RILC + LDW *+SP(276),B2 ; Recover saved ITSR + NOP 4 ; Delay + MVC B0,ILC ; Setup ILC + MVC B1,RILC ; Setup RILC + MVC B2,ITSR ; Setup ITSR + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(40),A5 ; Recover A5 + LDW *+SP(44),A6 ; Recover A6 + LDW *+SP(48),A7 ; Recover A7 + LDW *+SP(52),A8 ; Recover A8 + LDW *+SP(56),A9 ; Recover A9 + LDW *+SP(60),A10 ; Recover A10 + LDW *+SP(64),A11 ; Recover A11 + LDW *+SP(68),A12 ; Recover A12 + LDW *+SP(72),A13 ; Recover A13 + LDW *+SP(76),A14 ; Recover A14 + LDW *+SP(80),A15 ; Recover A15 (FP) + LDW *+SP(84),B0 ; Recover B0 + LDW *+SP(88),B1 ; Recover B1 + LDW *+SP(92),B2 ; Recover B2 + LDW *+SP(96),B3 ; Recover B3 + LDW *+SP(100),B4 ; Recover B4 + LDW *+SP(104),B5 ; Recover B5 + LDW *+SP(108),B6 ; Recover B6 + LDW *+SP(112),B7 ; Recover B7 + LDW *+SP(116),B8 ; Recover B8 + LDW *+SP(120),B9 ; Recover B9 + LDW *+SP(124),B10 ; Recover B10 + LDW *+SP(128),B11 ; Recover B11 + LDW *+SP(140),A16 ; Recover A16 + LDW *+SP(144),A17 ; Recover A17 + LDW *+SP(148),A18 ; Recover A18 + LDW *+SP(152),A19 ; Recover A19 + LDW *+SP(156),A20 ; Recover A20 + LDW *+SP(160),A21 ; Recover A21 + LDW *+SP(164),A22 ; Recover A22 + LDW *+SP(168),A23 ; Recover A23 + LDW *+SP(172),A24 ; Recover A24 + LDW *+SP(176),A25 ; Recover A25 + LDW *+SP(180),A26 ; Recover A26 + LDW *+SP(184),A27 ; Recover A27 + LDW *+SP(188),A28 ; Recover A28 + LDW *+SP(192),A29 ; Recover A29 + LDW *+SP(196),A30 ; Recover A30 + LDW *+SP(200),A31 ; Recover A31 + LDW *+SP(204),B16 ; Recover B16 + LDW *+SP(208),B17 ; Recover B17 + LDW *+SP(212),B18 ; Recover B18 + LDW *+SP(216),B19 ; Recover B19 + LDW *+SP(220),B20 ; Recover B20 + LDW *+SP(224),B21 ; Recover B21 + LDW *+SP(228),B22 ; Recover B22 + LDW *+SP(232),B23 ; Recover B23 + LDW *+SP(236),B24 ; Recover B24 + LDW *+SP(240),B25 ; Recover B25 + LDW *+SP(244),B26 ; Recover B26 + LDW *+SP(248),B27 ; Recover B27 + LDW *+SP(252),B28 ; Recover B28 + LDW *+SP(256),B29 ; Recover B29 + LDW *+SP(260),B30 ; Recover B30 + LDW *+SP(264),B31 ; Recover B31 + B IRP ; Return to point of interrupt +|| LDW *+SP(132),B12 ; Recover B12 + LDW *+SP(136),B13 ; Recover B13 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +;} + diff --git a/ports/c667x/ccs/src/tx_thread_stack_build.asm b/ports/c667x/ccs/src/tx_thread_stack_build.asm new file mode 100644 index 00000000..8e6c0559 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_stack_build.asm @@ -0,0 +1,257 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +ADDRESS_MSK .set 0xFFFFFFF0 +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + .global _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the C667x should look like the following after it is built: +; +; Stack Top: N/A Available for use +; 1 Interrupt stack frame type 4 +; CSR Initial value for CSR 8 +; IRP Initial thread entry 12 +; AMR Initial thread addressing mode 16 +; A0 Initial A0 20 +; A1 Initial A1 24 +; A2 Initial A2 28 +; A3 Initial A3 32 +; A4 Initial A4 36 +; A5 Initial A5 40 +; A6 Initial A6 44 +; A7 Initial A7 48 +; A8 Initial A8 52 +; A9 Initial A9 56 +; A10 Initial A10 60 +; A11 Initial A11 64 +; A12 Initial A12 68 +; A13 Initial A13 72 +; A14 Initial A14 76 +; A15 (FP) Initial A15 (FP) 80 +; B0 Initial B0 84 +; B1 Initial B1 88 +; B2 Initial B2 92 +; B3 Initial B3 96 +; B4 Initial B4 100 +; B5 Initial B5 104 +; B6 Initial B6 108 +; B7 Initial B7 112 +; B8 Initial B8 116 +; B9 Initial B9 120 +; B10 Initial B10 124 +; B11 Initial B11 128 +; B12 Initial B12 132 +; B13 Initial B13 136 +; A16 Initial A16 140 +; A17 Initial A17 144 +; A18 Initial A18 148 +; A19 Initial A19 152 +; A20 Initial A20 156 +; A21 Initial A21 160 +; A22 Initial A22 164 +; A23 Initial A23 168 +; A24 Initial A24 172 +; A25 Initial A25 176 +; A26 Initial A26 180 +; A27 Initial A27 184 +; A28 Initial A28 188 +; A29 Initial A29 192 +; A30 Initial A30 196 +; A31 Initial A31 200 +; B16 Initial B16 204 +; B17 Initial B17 208 +; B18 Initial B18 212 +; B19 Initial B19 216 +; B20 Initial B20 220 +; B21 Initial B21 224 +; B22 Initial B22 228 +; B23 Initial B23 232 +; B24 Initial B24 236 +; B25 Initial B25 240 +; B26 Initial B26 244 +; B27 Initial B27 248 +; B28 Initial B28 252 +; B29 Initial B29 256 +; B30 Initial B30 260 +; B31 Initial B31 264 +; ILC Initial ILC 268 +; RILC Initial RILC 272 +; ITSR Initial ITSR 276 + + +; +; Stack Bottom: (higher memory address) */ +; + LDW *+A4(16),A0 ; Pickup end of stack area + MVKL ADDRESS_MSK,A1 ; Build address mask + MVKH ADDRESS_MSK,A1 ; + MVC CSR,B0 ; Pickup current CSR + AND -2,B0,B0 ; Clear GIE bit + OR 2,B0,B0 ; Set PGIE bit for interrupt return + AND A1,A0,A0 ; Ensure alignment + MVKL 288,A2 ; Calculate stack size + SUB A0,A2,A0 ; Allocate space on thread's stack +; +; /* Actually build the stack frame. */ +; + MVKL 1,A2 ; Build stack type + ZERO A3 ; Clear value + STW A2,*+A0(4) ; Interrupt stack type + STW B0,*+A0(8) ; Initial CSR + STW B4,*+A0(12) ; Thread shell entry point + STW A3,*+A0(16) ; Initial AMR + STW A3,*+A0(20) ; Initial A0 + STW A3,*+A0(24) ; Initial A1 + STW A3,*+A0(28) ; Initial A2 + STW A3,*+A0(32) ; Initial A3 + STW A3,*+A0(36) ; Initial A4 + STW A3,*+A0(40) ; Initial A5 + STW A3,*+A0(44) ; Initial A6 + STW A3,*+A0(48) ; Initial A7 + STW A3,*+A0(52) ; Initial A8 + STW A3,*+A0(56) ; Initial A9 + STW A3,*+A0(60) ; Initial A10 + STW A3,*+A0(64) ; Initial A11 + STW A3,*+A0(68) ; Initial A12 + STW A3,*+A0(72) ; Initial A13 + STW A3,*+A0(76) ; Initial A14 + STW A3,*+A0(80) ; Initial A15 + STW A3,*+A0(84) ; Initial B0 + STW A3,*+A0(88) ; Initial B1 + STW A3,*+A0(92) ; Initial B2 + STW A3,*+A0(96) ; Initial B3 + STW A3,*+A0(100) ; Initial B4 + STW A3,*+A0(104) ; Initial B5 + STW A3,*+A0(108) ; Initial B6 + STW A3,*+A0(112) ; Initial B7 + STW A3,*+A0(116) ; Initial B8 + STW A3,*+A0(120) ; Initial B9 + STW A3,*+A0(124) ; Initial B10 + MVKL 128,A2 ; Stack adjustment value + ADD A2,A0,A2 ; Adjust pointer into stack frame + STW A3,*+A2(0) ; Initial B11 + STW A3,*+A2(4) ; Initial B12 + STW A3,*+A2(8) ; Initial B13 + STW A3,*+A2(12) ; Initial A16 + STW A3,*+A2(16) ; Initial A17 + STW A3,*+A2(20) ; Initial A18 + STW A3,*+A2(24) ; Initial A19 + STW A3,*+A2(28) ; Initial A20 + STW A3,*+A2(32) ; Initial A21 + STW A3,*+A2(36) ; Initial A22 + STW A3,*+A2(40) ; Initial A23 + STW A3,*+A2(44) ; Initial A24 + STW A3,*+A2(48) ; Initial A25 + STW A3,*+A2(52) ; Initial A26 + STW A3,*+A2(56) ; Initial A27 + STW A3,*+A2(60) ; Initial A28 + STW A3,*+A2(64) ; Initial A29 + STW A3,*+A2(68) ; Initial A30 + STW A3,*+A2(72) ; Initial A31 + STW A3,*+A2(76) ; Initial B16 + STW A3,*+A2(80) ; Initial B17 + STW A3,*+A2(84) ; Initial B18 + STW A3,*+A2(88) ; Initial B19 + STW A3,*+A2(92) ; Initial B20 + STW A3,*+A2(96) ; Initial B21 + STW A3,*+A2(100) ; Initial B22 + STW A3,*+A2(104) ; Initial B23 + STW A3,*+A2(108) ; Initial B24 + STW A3,*+A2(112) ; Initial B25 + STW A3,*+A2(116) ; Initial B26 + STW A3,*+A2(120) ; Initial B27 + STW A3,*+A2(124) ; Initial B28 + ADDK 128,A2 ; Adjust stack pointer again + STW A3,*+A2(0) ; Initial B29 + STW A3,*+A2(4) ; Initial B30 + STW A3,*+A2(8) ; Initial B31 + B B3 ; Return to caller + STW A3,*+A2(12) ; Initial ILC + STW A3,*+A2(16) ; Initial RILC + MVKL 0x3,B0 ; Build initial ITSR (set GIE and SGIE bits) + STW B0,*+A2(20) ; Store ITSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = A0; +; + STW A0,*+A4(8) ; Save stack pointer in thread's + ; control block +;} + diff --git a/ports/c667x/ccs/src/tx_thread_system_return.asm b/ports/c667x/ccs/src/tx_thread_system_return.asm new file mode 100644 index 00000000..67de8e21 --- /dev/null +++ b/ports/c667x/ccs/src/tx_thread_system_return.asm @@ -0,0 +1,162 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; +; + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_system_stack_ptr +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + .global _tx_thread_system_return +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; + MVC CSR,B0 ; Pickup current CSR + MVC AMR,B1 ; Pickup current AMR + ADDK -64,SP ; Allocate stack space + ZERO B2 ; Build solicited stack type + STW B2,*+SP(4) ; Save stack type + STW B0,*+SP(8) ; Save CSR + STW B3,*+SP(12) ; Save B3 (return address) + STW B1,*+SP(16) ; Save AMR + STW A10,*+SP(20) ; Save A10 + STW A11,*+SP(24) ; Save A11 + STW A12,*+SP(28) ; Save A12 + STW A13,*+SP(32) ; Save A13 + STW A14,*+SP(36) ; Save A14 + STW A15,*+SP(40) ; Save A15 + STW B10,*+SP(44) ; Save B10 + STW B11,*+SP(48) ; Save B11 + STW B12,*+SP(52) ; Save B12 + STW B13,*+SP(56) ; Save B13 + MVC ILC,B0 ; Pickup ILC + MVC RILC,B1 ; Pickup RILC + STW B0,*+SP(60) ; Save ILC + STW B1,*+SP(64) ; Save RILC +; +; /* Lockout interrupts. */ +; + AND -2,B0,B0 ; Build interrupt disable value + MVC B0,CSR ; Lockout interrupts +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; SP = _tx_thread_system_stack_ptr; +; + MVKL _tx_timer_time_slice,A2 ; Pickup address of time slice + MVKH _tx_timer_time_slice,A2 ; + LDW *A2,B0 ; Pickup time slice + MVKL _tx_thread_current_ptr,A1 ; Pickup address of current thread + MVKH _tx_thread_current_ptr,A1 ; + LDW *A1,A4 ; Pickup current thread pointer + MVKL _tx_thread_system_stack_ptr,A3 ; Pickup address of system stack + MVKH _tx_thread_system_stack_ptr,A3 ; +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + [!B0] B _tx_thread_dont_save_ts ; If no-time slice, skip save + NOP ; Delay slot + STW SP,*+A4(8) ; Save thread's stack pointer + LDW *A3,SP ; Switch to system stack pointer + NOP ; Delay slot +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; + NOP ; + STW B2,*A2 ; Clear time-slice + NOP 2 ; Delay slots + STW B0,*+A4(24) ; Save time-slice +; +; +; } +_tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + B _tx_thread_schedule ; Return to scheduling loop + STW B2,*A1 ; Set current thread to NULL + NOP 4 ; Delay slots +; +;} + diff --git a/ports/c667x/ccs/src/tx_timer_interrupt.asm b/ports/c667x/ccs/src/tx_timer_interrupt.asm new file mode 100644 index 00000000..b6a2f0a1 --- /dev/null +++ b/ports/c667x/ccs/src/tx_timer_interrupt.asm @@ -0,0 +1,300 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +FP .set A15 +DP .set B14 +SP .set B15 +; +;Define Assembly language external references... +; + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_timer_expiration_process + .global _tx_thread_time_slice + .global _tx_thread_context_save + .global _tx_thread_context_restore +; +; + .sect ".text" +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt C667x/TI */ +;/* 6.0 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_context_save Context save */ +;/* _tx_thread_context_restore Context restore */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + .global _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that registers B3, A0-A4 have +; already been saved and the space for saving additional registers has +; already been reserved. In addition, interrupts are locked out and must +; remain so until context save returns. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MVKL _tx_timer_system_clock,A0 ; Build address of system clock + MVKH _tx_timer_system_clock,A0 ; + LDW *A0,A2 ; Pickup system clock + MVKL _tx_timer_time_slice,A3 ; Build address of time slice + MVKH _tx_timer_time_slice,A3 ; + LDW *A3,A1 ; Pickup time slice + NOP 2 ; Delay + ADD 1,A2,A2 ; Increment the system clock + STW A2,*A0 ; Store it back in memory +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + [!A1] B _tx_timer_no_time_slice ; If 0, skip time slice processing + SUB A1,1,A1 ; Decrement time-slice value + NOP 4 ; Delay slots +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; +; /* Check for expiration. */ +; if (_tx_timer_time_slice == 0) +; + [A1] B _tx_timer_no_time_slice ; If non-zero, not expired yet + STW A1,*A3 ; Store new time-slice + MVKL _tx_timer_expired_time_slice,A0 ; Build address of expired flag + MVKH _tx_timer_expired_time_slice,A0 ; + MVKL 1,A4 ; Expired flag + NOP ; Delay +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + STW A4,*A0 ; Set expired flag +; } +; +_tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MVKL _tx_timer_current_ptr,A2 ; Build address of current timer pointer + MVKH _tx_timer_current_ptr,A2 ; + LDW *A2,A0 ; Pickup timer list address + MVKL _tx_timer_expired,A3 ; Build address of expired flag + MVKH _tx_timer_expired,A3 ; + NOP 2 ; Delay slots + LDW *A0,A1 ; Pickup current timer entry + ADD 4,A0,A0 ; Increment the current pointer + NOP 3 ; Delay slots + [A1] B _tx_timer_done ; If non-NULL, something has expired +; +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MVKL 1,A4 ; Build expired flag + [A1] STW A4,*A3 ; Set expired flag + NOP 3 ; Delay slots +; +; } +; else +; { +_tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MVKL _tx_timer_list_end,A3 ; Build timer list end address + MVKH _tx_timer_list_end,A3 ; + LDW *A3,A4 ; Pickup list end address + MVKL _tx_timer_list_start,A3 ; Build timer list start address + MVKH _tx_timer_list_start,A3 ; + NOP 2 ; Delay slots + CMPEQ A4,A0,A1 ; Compare current pointer with end + [A1] LDW *A3,A0 ; If at the end, pickup timer list start + NOP 4 ; Delay slots +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; +_tx_timer_skip_wrap: +; +; + STW A0,*A2 ; Store current timer pointer +; } +; +_tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MVKL _tx_timer_expired_time_slice,A3 ; Build time-slice expired flag + MVKH _tx_timer_expired_time_slice,A3 ; + LDW *A3,A4 ; Pickup time-slice expired flag + MVKL _tx_timer_expired,A0 ; Build timer expired flag + MVKH _tx_timer_expired,A0 ; + LDW *A0,A2 ; Pickup timer expired flag + NOP 4 ; Delay slots + OR A2,A4,A1 ; Combine expired flags + [!A1] B _tx_timer_nothing_expired + NOP 5 ; Delay slots +; +_tx_something_expired: +; +; +; /* Something expired, call context save. */ +; _tx_thread_context_save(); +; + B _tx_thread_context_save ; Call context save routine + MVKL _tx_timer_ISR_return,B3 ; Build return address + MVKH _tx_timer_ISR_return,B3 ; + NOP 3 ; Delay slots +_tx_timer_ISR_return: +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MVKL _tx_timer_expired,A0 ; Build timer expired address + MVKH _tx_timer_expired,A0 ; + LDW *A0,A1 ; Pickup expired flag + NOP 4 ; Delay slots + [!A1] B _tx_timer_dont_activate ; If not set, skip timer activation + NOP 5 ; Delay slots +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + B _tx_timer_expiration_process ; Process timer expiration + MVKL _tx_timer_ISR_return_1,B3 ; Build return address + MVKH _tx_timer_ISR_return_1,B3 ; + NOP 3 ; Delay slots +_tx_timer_ISR_return_1: +; +; } +_tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MVKL _tx_timer_expired_time_slice,A0 ; Build address of expired flag + MVKH _tx_timer_expired_time_slice,A0 ; + LDW *A0,A1 ; Pickup expired flag + NOP 4 ; Delay slots + [!A1] B _tx_timer_not_ts_expiration ; If not set, skip time-slice processing + NOP 5 ; Delay slots +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); +; + B _tx_thread_time_slice ; Call time-slice processing + MVKL _tx_timer_ISR_return_2,B3 ; Build return address + MVKH _tx_timer_ISR_return_2,B3 ; + NOP 3 ; Delay slots +_tx_timer_ISR_return_2: +; +; } +; +_tx_timer_not_ts_expiration: +; +; +; /* Call context restore. */ +; _tx_thread_context_restore(); +; + B _tx_thread_context_restore ; Jump to context restore - no return! + NOP 5 ; Delay slots +; +; } +; +_tx_timer_nothing_expired: +; + LDW *+SP(20),A0 ; Recover A0 + LDW *+SP(24),A1 ; Recover A1 + LDW *+SP(28),A2 ; Recover A2 + LDW *+SP(32),A3 ; Recover A3 + B IRP ; Return to point of interrupt +|| LDW *+SP(36),A4 ; Recover A4 + LDW *+SP(96),B3 ; Recover B3 + ADDK.S2 288,SP ; Recover stack space + NOP 3 ; Delay slots +; +;} + diff --git a/ports/cortex_a15/gnu/example_build/build_threadx.bat b/ports/cortex_a15/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..38377100 --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a15/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a15/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..af64fc3b --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a15 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a15 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a15/gnu/example_build/crt0.S b/ports/cortex_a15/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a15/gnu/example_build/libc.a b/ports/cortex_a15/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_a15/gnu/example_build/libc.a differ diff --git a/ports/cortex_a15/gnu/example_build/libgcc.a b/ports/cortex_a15/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_a15/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_a15/gnu/example_build/reset.S b/ports/cortex_a15/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_a15/gnu/example_build/sample_threadx.c b/ports/cortex_a15/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a15/gnu/example_build/sample_threadx.ld b/ports/cortex_a15/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_a15/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_a15/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..d441ec20 --- /dev/null +++ b/ports/cortex_a15/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_a15/gnu/inc/tx_port.h b/ports/cortex_a15/gnu/inc/tx_port.h new file mode 100644 index 00000000..fd663938 --- /dev/null +++ b/ports/cortex_a15/gnu/inc/tx_port.h @@ -0,0 +1,323 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A15/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A15. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A15/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a15/gnu/readme_threadx.txt b/ports/cortex_a15/gnu/readme_threadx.txt new file mode 100644 index 00000000..45fabd8e --- /dev/null +++ b/ports/cortex_a15/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A15 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A15 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a15 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a15 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a15 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a15 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A15 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A15 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A15 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a15/gnu/src/tx_thread_context_restore.S b/ports/cortex_a15/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..d491780a --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_context_save.S b/ports/cortex_a15/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..c62862cf --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..7a49178d --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..2ce9dc46 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..d1f31183 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..8f6c34bf --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..7ca32c7b --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..78a89b80 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..8614e43a --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..c414ab0b --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..6c433de5 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_schedule.S b/ports/cortex_a15/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..550e71ac --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a15/gnu/src/tx_thread_stack_build.S b/ports/cortex_a15/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..3b3b75b4 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A15 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a15/gnu/src/tx_thread_system_return.S b/ports/cortex_a15/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..b3a3fe65 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..7b7a5d9f --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a15/gnu/src/tx_timer_interrupt.S b/ports/cortex_a15/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..1dc0e511 --- /dev/null +++ b/ports/cortex_a15/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A15/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a5/ac5/example_build/build_threadx.bat b/ports/cortex_a5/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..d0c3a2cb --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a5 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a5 --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a5/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a5/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..6ef816c4 --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a5 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a5 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a5/ac5/example_build/sample_threadx.c b/ports/cortex_a5/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..03505b66 --- /dev/null +++ b/ports/cortex_a5/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A5 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a5/ac5/inc/tx_port.h b/ports/cortex_a5/ac5/inc/tx_port.h new file mode 100644 index 00000000..d2f09195 --- /dev/null +++ b/ports/cortex_a5/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a5/ac5/readme_threadx.txt b/ports/cortex_a5/ac5/readme_threadx.txt new file mode 100644 index 00000000..4dcbf556 --- /dev/null +++ b/ports/cortex_a5/ac5/readme_threadx.txt @@ -0,0 +1,545 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A5 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A5 Specifies Cortex-A5 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A5 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A5 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5/ac5/src/tx_thread_context_restore.s b/ports/cortex_a5/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1434cb44 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_context_save.s b/ports/cortex_a5/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..fac7c5a4 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..66186e5a --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore + +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..198ea091 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..d1007354 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..aa8e30bd --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..9c48eea6 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b9996a64 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..a331c9df --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..42d3fca2 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..eb7c2952 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_schedule.s b/ports/cortex_a5/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..6e250a23 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_stack_build.s b/ports/cortex_a5/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..00764f2b --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_system_return.s b/ports/cortex_a5/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..a5e3120b --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..375b9fad --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a5/ac5/src/tx_timer_interrupt.s b/ports/cortex_a5/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..422e3576 --- /dev/null +++ b/ports/cortex_a5/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a5/gnu/example_build/build_threadx.bat b/ports/cortex_a5/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..cad49aca --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a5/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a5/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..123a84c8 --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a5 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a5 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a5/gnu/example_build/crt0.S b/ports/cortex_a5/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a5/gnu/example_build/libc.a b/ports/cortex_a5/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_a5/gnu/example_build/libc.a differ diff --git a/ports/cortex_a5/gnu/example_build/libgcc.a b/ports/cortex_a5/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_a5/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_a5/gnu/example_build/reset.S b/ports/cortex_a5/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_a5/gnu/example_build/sample_threadx.c b/ports/cortex_a5/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5/gnu/example_build/sample_threadx.ld b/ports/cortex_a5/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_a5/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_a5/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..e4c5b25f --- /dev/null +++ b/ports/cortex_a5/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_a5/gnu/inc/tx_port.h b/ports/cortex_a5/gnu/inc/tx_port.h new file mode 100644 index 00000000..8a389740 --- /dev/null +++ b/ports/cortex_a5/gnu/inc/tx_port.h @@ -0,0 +1,323 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a5/gnu/readme_threadx.txt b/ports/cortex_a5/gnu/readme_threadx.txt new file mode 100644 index 00000000..37a92981 --- /dev/null +++ b/ports/cortex_a5/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A5 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a5 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a5 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a5 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a5 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A5 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A5 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5/gnu/src/tx_thread_context_restore.S b/ports/cortex_a5/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..2a3f0165 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_context_save.S b/ports/cortex_a5/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..d35776b6 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..b7a6d9cb --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..44dbcf7d --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..884f3347 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..f80d74b6 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ff7db62d --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..a65b911d --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..4bea9e52 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..35284eed --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..6b702e93 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_schedule.S b/ports/cortex_a5/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..df86a053 --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a5/gnu/src/tx_thread_stack_build.S b/ports/cortex_a5/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..90f28e0b --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A5 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a5/gnu/src/tx_thread_system_return.S b/ports/cortex_a5/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..7c2878de --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..de6a5a7c --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a5/gnu/src/tx_timer_interrupt.S b/ports/cortex_a5/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..cdecf06c --- /dev/null +++ b/ports/cortex_a5/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a5/iar/example_build/azure_rtos.eww b/ports/cortex_a5/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a5/iar/example_build/cstartup.s b/ports/cortex_a5/iar/example_build/cstartup.s new file mode 100644 index 00000000..647de2e8 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/cstartup.s @@ -0,0 +1,156 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #0x40000000 ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.c b/ports/cortex_a5/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..68cd97fe --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.c @@ -0,0 +1,374 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.dep b/ports/cortex_a5/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..5846d006 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.dep @@ -0,0 +1,220 @@ + + + 4 + 1484414870 + + Debug + + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\xencoding_limits.h + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\Debug\Obj\cstartup.o + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\tx_execution_profile.c + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\cstartup.s + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\lib\m7Sx_tl.a + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + [ROOT_NODE] + + + ILINK + 40 3 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 29 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 49 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 0 + + + + + ICCARM + 32 41 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 26 + + + BICOMP + 22 + + + + + ICCARM + 32 41 20 1 2 6 27 10 4 7 14 50 13 5 + + + BICOMP + 32 41 20 1 2 6 10 4 7 14 50 13 5 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 9 19 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 12 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 9 19 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 47 + + + __cstat + 45 + + + BICOMP + 51 + + + + + ICCARM + 57 58 16 25 52 30 35 21 28 53 36 54 43 56 55 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 3 + + + + + ILINK + 24 12 47 31 9 15 48 44 46 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 12 17 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.ewd b/ports/cortex_a5/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..af953994 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.ewp b/ports/cortex_a5/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..ea70843b --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.ewt b/ports/cortex_a5/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..7bc99f50 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a5/iar/example_build/sample_threadx.icf b/ports/cortex_a5/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..5d070138 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 234 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000900259600000100000010860000090000000C81000002000000048600000100000017810000010000000E8100000100000011860000090000004681000001000000E880000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000056040000000A000065050000 + 000000003F040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000057040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 0000000032000000320100003B040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF3201000032000000360100003B0400000100000002000010040000000100000023FFFFFF83080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000003B040000000A00003F040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000056040000000A000065050000000000003F040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..ad03338f --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..de4f156b --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..50057893 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A5" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..22442691 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a5\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a5/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..57b93b13 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1385 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 155 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1A0000000900259600000100000010860000090000000C81000002000000048600000100000017810000010000000E8100000100000011860000090000004681000001000000E880000001000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 2800578600001800000059920000240000001581000055000000239200000000000007E100006B00000004E1000069000000008D00001E00000007860000280000001D920000110000000D8000004700000001E100006600000004860000250000009A860000160000001781000057000000008400007800000025920000190000001481000054000000449200002200000000810000490000001A860000320000001F9200001F00000003E10000680000008E8600003B00000006860000270000002D9200002100000000E1000065000000698600003800000041E10000750000005586000006000000239600008900000016810000560000000E86000017000000518400008600000005E100006A000000A18600003C000000C38600000300000002E1000067000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + FA0800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFFF60800004C000000FA0800009A040000010000000200001004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000000062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..e0660a42 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 3259531530 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..50057893 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A5" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.crun b/ports/cortex_a5/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.dbgdt b/ports/cortex_a5/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a5/iar/example_build/settings/tx.dnx b/ports/cortex_a5/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a5/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a5/iar/example_build/tx.dep b/ports/cortex_a5/iar/example_build/tx.dep new file mode 100644 index 00000000..e9942276 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.dep @@ -0,0 +1,10500 @@ + + + 4 + 2746525381 + + Debug + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Txe_bytr.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Txe_bytp.c + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Tx_tt.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Tx_tpch.c + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + [ROOT_NODE] + + + IARCHIVE + 621 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 499 + + + __cstat + 926 + + + BICOMP + 664 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 590 + + + __cstat + 920 + + + BICOMP + 496 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 15 + + + BICOMP + 15 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 642 + + + __cstat + 938 + + + BICOMP + 610 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 315 + + + __cstat + 907 + + + BICOMP + 404 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 10 + + + BICOMP + 479 850 868 113 943 134 474 841 5 10 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 751 + + + __cstat + 921 + + + BICOMP + 396 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 10 + + + BICOMP + 479 850 868 113 943 134 474 841 5 10 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 405 + + + __cstat + 856 + + + BICOMP + 546 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 15 + + + BICOMP + 868 479 227 483 5 15 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 826 + + + __cstat + 917 + + + BICOMP + 422 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 15 + + + BICOMP + 15 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 657 + + + __cstat + 905 + + + BICOMP + 603 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 10 + + + BICOMP + 868 474 841 227 479 943 850 5 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 632 + + + __cstat + 918 + + + BICOMP + 500 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 10 + + + BICOMP + 868 10 474 841 227 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 807 + + + __cstat + 913 + + + BICOMP + 506 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 15 + + + BICOMP + 868 479 227 483 5 15 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 645 + + + __cstat + 923 + + + BICOMP + 618 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 10 + + + BICOMP + 868 474 841 227 479 943 850 5 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 811 + + + __cstat + 937 + + + BICOMP + 600 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 490 + + + __cstat + 860 + + + BICOMP + 656 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 15 + + + BICOMP + 113 483 134 868 479 5 15 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 749 + + + __cstat + 915 + + + BICOMP + 611 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 15 + + + BICOMP + 113 483 134 868 479 5 15 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 675 + + + __cstat + 934 + + + BICOMP + 492 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 15 + + + BICOMP + 15 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 475 + + + __cstat + 886 + + + BICOMP + 550 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 113 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 430 + + + __cstat + 909 + + + BICOMP + 759 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 943 10 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 689 + + + __cstat + 895 + + + BICOMP + 571 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 40 + + + BICOMP + 809 464 227 868 854 850 5 40 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 320 + + + __cstat + 887 + + + BICOMP + 351 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 854 40 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + __cstat + 872 + + + BICOMP + 382 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 854 40 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 778 + + + __cstat + 894 + + + BICOMP + 526 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 854 40 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 777 + + + __cstat + 878 + + + BICOMP + 502 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 27 + + + BICOMP + 113 809 464 227 868 854 850 5 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 773 + + + __cstat + 847 + + + BICOMP + 415 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 943 10 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 425 + + + __cstat + 819 + + + BICOMP + 655 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 10 + + + BICOMP + 868 10 474 841 227 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 513 + + + __cstat + 873 + + + BICOMP + 85 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 560 + + + __cstat + 891 + + + BICOMP + 650 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 27 + + + BICOMP + 113 809 464 227 868 854 850 5 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 109 + + + __cstat + 810 + + + BICOMP + 652 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 723 + + + __cstat + 900 + + + BICOMP + 651 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 27 + + + BICOMP + 113 809 464 227 868 854 850 5 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 784 + + + __cstat + 890 + + + BICOMP + 767 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 705 + + + __cstat + 881 + + + BICOMP + 846 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 27 + + + BICOMP + 27 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 540 + + + __cstat + 925 + + + BICOMP + 497 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 943 10 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 837 + + + __cstat + 862 + + + BICOMP + 489 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 27 + + + BICOMP + 868 850 854 134 809 464 5 27 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 722 + + + __cstat + 897 + + + BICOMP + 672 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 27 + + + BICOMP + 113 27 809 464 227 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 534 + + + __cstat + 896 + + + BICOMP + 509 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 40 + + + BICOMP + 479 850 868 134 943 5 474 841 38 40 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 333 + + + __cstat + 859 + + + BICOMP + 570 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 440 + + + __cstat + 877 + + + BICOMP + 801 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 40 + + + BICOMP + 868 850 113 854 134 809 464 5 40 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 654 + + + __cstat + 838 + + + BICOMP + 100 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 10 + + + BICOMP + 868 10 474 841 227 113 479 943 850 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 597 + + + __cstat + 885 + + + BICOMP + 756 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 + + + BICOMP + 483 38 868 479 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 504 + + + __cstat + 857 + + + BICOMP + 599 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 10 + + + BICOMP + 479 850 868 943 134 113 474 841 5 10 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 602 + + + __cstat + 876 + + + BICOMP + 418 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 27 + + + BICOMP + 27 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 530 + + + __cstat + 864 + + + BICOMP + 582 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 38 134 235 117 138 27 40 15 10 + + + BICOMP + 117 15 713 227 134 27 113 850 5 38 235 138 40 10 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 336 + + + __cstat + 884 + + + BICOMP + 604 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 227 40 + + + BICOMP + 40 809 464 134 868 854 850 5 227 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 472 + + + __cstat + 861 + + + BICOMP + 716 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 765 + + + __cstat + 889 + + + BICOMP + 359 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 731 + + + __cstat + 916 + + + BICOMP + 592 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 785 + + + __cstat + 919 + + + BICOMP + 485 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 117 + + + BICOMP + 113 868 479 227 483 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 818 + + + __cstat + 901 + + + BICOMP + 776 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 138 + + + BICOMP + 850 134 113 713 5 138 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 536 + + + __cstat + 931 + + + BICOMP + 548 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 138 + + + BICOMP + 713 227 850 5 138 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 788 + + + __cstat + 928 + + + BICOMP + 434 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 568 + + + __cstat + 929 + + + BICOMP + 390 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 113 713 227 850 5 134 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 340 + + + __cstat + 912 + + + BICOMP + 512 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 467 + + + __cstat + 898 + + + BICOMP + 747 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 693 + + + __cstat + 933 + + + BICOMP + 401 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 629 + + + __cstat + 935 + + + BICOMP + 408 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 686 + + + __cstat + 908 + + + BICOMP + 636 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 113 117 868 479 227 483 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 549 + + + __cstat + 893 + + + BICOMP + 770 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 580 + + + __cstat + 930 + + + BICOMP + 574 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 412 + + + __cstat + 902 + + + BICOMP + 802 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 117 + + + BICOMP + 113 868 479 227 483 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 714 + + + __cstat + 882 + + + BICOMP + 752 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 522 + + + __cstat + 927 + + + BICOMP + 735 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 138 + + + BICOMP + 713 227 850 5 138 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 391 + + + __cstat + 924 + + + BICOMP + 514 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 138 + + + BICOMP + 113 713 227 850 5 138 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 358 + + + __cstat + 899 + + + BICOMP + 458 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 403 + + + __cstat + 892 + + + BICOMP + 397 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 117 + + + BICOMP + 113 868 479 227 483 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 456 + + + __cstat + 903 + + + BICOMP + 697 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 138 713 227 850 5 134 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 569 + + + __cstat + 932 + + + BICOMP + 762 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 40 + + + BICOMP + 40 809 464 227 868 854 850 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 409 + + + __cstat + 906 + + + BICOMP + 545 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 138 + + + BICOMP + 113 138 713 227 850 5 134 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 748 + + + __cstat + 922 + + + BICOMP + 453 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 117 + + + BICOMP + 113 483 134 868 479 5 117 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 865 + + + __cstat + 880 + + + BICOMP + 678 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 460 + + + __cstat + 888 + + + BICOMP + 790 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 117 + + + BICOMP + 117 868 479 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 663 + + + __cstat + 910 + + + BICOMP + 647 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 648 + + + __cstat + 883 + + + BICOMP + 791 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 40 + + + BICOMP + 868 850 113 854 134 809 464 5 40 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 332 + + + __cstat + 936 + + + BICOMP + 732 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 + + + BICOMP + 134 113 5 868 479 38 474 854 850 464 809 483 943 713 841 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 781 + + + __cstat + 59 + + + BICOMP + 707 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 38 + + + BICOMP + 868 479 38 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 585 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 494 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 537 + + + __cstat + 879 + + + BICOMP + 316 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 673 + + + __cstat + 97 + + + BICOMP + 575 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 867 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 348 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 699 + + + __cstat + 874 + + + BICOMP + 665 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 38 + + + BICOMP + 868 479 38 227 483 5 134 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 581 + + + __cstat + 848 + + + BICOMP + 821 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 344 + + + __cstat + 940 + + + BICOMP + 641 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 113 943 227 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 596 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 353 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 794 + + + __cstat + 300 + + + BICOMP + 524 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 727 + + + __cstat + 849 + + + BICOMP + 399 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 782 + + + __cstat + 852 + + + BICOMP + 615 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 771 + + + __cstat + 904 + + + BICOMP + 721 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 113 943 227 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 843 + + + __cstat + 855 + + + BICOMP + 720 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 113 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 468 + + + __cstat + 55 + + + BICOMP + 313 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 591 + + + __cstat + 53 + + + BICOMP + 307 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 416 + + + __cstat + 283 + + + BICOMP + 695 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 442 + + + __cstat + 49 + + + BICOMP + 327 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 842 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 324 + + + __cstat + 875 + + + BICOMP + 331 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 437 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 744 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 853 + + + __cstat + 107 + + + BICOMP + 870 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 113 809 464 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 635 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 780 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 473 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 719 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 692 + + + __cstat + 942 + + + BICOMP + 669 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 113 483 15 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 851 + + + __cstat + 70 + + + BICOMP + 566 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 15 + + + BICOMP + 235 113 483 38 868 479 5 134 15 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 660 + + + __cstat + 98 + + + BICOMP + 310 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 486 + + + __cstat + 84 + + + BICOMP + 828 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 15 + + + BICOMP + 868 15 113 474 841 134 479 943 850 5 235 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 450 + + + __cstat + 78 + + + BICOMP + 431 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 745 + + + __cstat + 914 + + + BICOMP + 775 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 10 + + + BICOMP + 479 850 868 235 943 38 474 841 5 134 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 89 + + + __cstat + 911 + + + BICOMP + 757 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 10 + + + BICOMP + 850 113 868 10 854 134 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 557 + + + __cstat + 941 + + + BICOMP + 833 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 483 15 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 447 + + + __cstat + 392 + + + BICOMP + 626 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 113 943 10 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 746 + + + __cstat + 387 + + + BICOMP + 681 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 10 + + + BICOMP + 479 850 868 235 943 38 113 474 841 5 134 10 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 432 + + + __cstat + 380 + + + BICOMP + 640 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 27 + + + BICOMP + 113 850 27 134 713 5 235 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 330 + + + __cstat + 329 + + + BICOMP + 772 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 10 + + + BICOMP + 479 850 868 113 943 10 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 99 + + + __cstat + 367 + + + BICOMP + 544 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 27 + + + BICOMP + 850 27 134 113 713 5 235 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 395 + + + __cstat + 379 + + + BICOMP + 362 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 428 + + + __cstat + 373 + + + BICOMP + 361 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 27 + + + BICOMP + 113 868 850 235 854 38 809 464 5 134 27 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 302 + + + __cstat + 389 + + + BICOMP + 786 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 854 27 809 464 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 844 + + + __cstat + 63 + + + BICOMP + 863 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 799 + + + __cstat + 364 + + + BICOMP + 813 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 27 + + + BICOMP + 868 850 113 854 27 809 464 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 343 + + + __cstat + 383 + + + BICOMP + 423 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 40 + + + BICOMP + 113 850 40 134 713 5 235 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 609 + + + __cstat + 66 + + + BICOMP + 711 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 606 + + + __cstat + 51 + + + BICOMP + 586 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 436 + + + __cstat + 384 + + + BICOMP + 326 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 40 + + + BICOMP + 868 850 235 854 38 809 464 5 134 40 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 858 + + + __cstat + 56 + + + BICOMP + 462 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 480 + + + __cstat + 77 + + + BICOMP + 834 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 113 943 227 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 646 + + + __cstat + 385 + + + BICOMP + 445 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 40 + + + BICOMP + 868 850 235 113 854 38 809 464 5 134 40 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 323 + + + __cstat + 76 + + + BICOMP + 449 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 357 + + + __cstat + 96 + + + BICOMP + 463 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 15 + + + BICOMP + 113 483 15 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 728 + + + __cstat + 939 + + + BICOMP + 671 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 10 + + + BICOMP + 479 850 868 235 943 38 474 841 5 134 10 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 410 + + + __cstat + 62 + + + BICOMP + 598 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 113 943 227 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 312 + + + __cstat + 52 + + + BICOMP + 539 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 471 + + + __cstat + 61 + + + BICOMP + 561 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 15 + + + BICOMP + 113 868 15 474 841 134 479 943 850 5 235 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 439 + + + __cstat + 106 + + + BICOMP + 350 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 + + + BICOMP + 809 464 235 113 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 448 + + + __cstat + 60 + + + BICOMP + 739 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 134 + + + BICOMP + 850 868 134 113 854 227 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 435 + + + __cstat + 319 + + + BICOMP + 633 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 113 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 583 + + + __cstat + 93 + + + BICOMP + 400 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 402 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 420 + + + __cstat + 95 + + + BICOMP + 355 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 601 + + + __cstat + 94 + + + BICOMP + 407 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 589 + + + __cstat + 110 + + + BICOMP + 667 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 742 + + + __cstat + 80 + + + BICOMP + 304 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 + + + BICOMP + 479 850 868 943 227 474 841 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 555 + + + __cstat + 54 + + + BICOMP + 356 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + __cstat + 82 + + + BICOMP + 614 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 476 + + + __cstat + 81 + + + BICOMP + 519 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 113 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 613 + + + __cstat + 72 + + + BICOMP + 523 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 + + + BICOMP + 809 464 113 235 868 854 850 5 134 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 871 + + + __cstat + 64 + + + BICOMP + 869 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 474 841 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 469 + + + __cstat + 75 + + + BICOMP + 87 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 + + + BICOMP + 479 850 868 943 227 113 474 841 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 620 + + + __cstat + 65 + + + BICOMP + 789 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 338 + + + __cstat + 103 + + + BICOMP + 661 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 823 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 493 + + + __cstat + 83 + + + BICOMP + 342 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 134 235 + + + BICOMP + 850 868 235 854 227 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 470 + + + __cstat + 321 + + + BICOMP + 737 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 227 + + + BICOMP + 850 868 227 854 235 809 464 5 134 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 832 + + + __cstat + 111 + + + BICOMP + 643 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 464 235 868 854 850 5 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 779 + + + __cstat + 101 + + + BICOMP + 388 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 113 854 227 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 363 + + + __cstat + 104 + + + BICOMP + 102 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 134 + + + BICOMP + 850 868 134 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 368 + + + __cstat + 91 + + + BICOMP + 301 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 113 868 854 850 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 508 + + + __cstat + 108 + + + BICOMP + 419 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 113 809 464 5 235 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 491 + + + __cstat + 309 + + + BICOMP + 639 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 787 + + + __cstat + 57 + + + BICOMP + 608 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 868 854 850 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 386 + + + __cstat + 58 + + + BICOMP + 501 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 227 235 + + + BICOMP + 850 868 854 227 809 464 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 668 + + + __cstat + 69 + + + BICOMP + 511 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 455 + + + __cstat + 295 + + + BICOMP + 349 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 577 + + + __cstat + 288 + + + BICOMP + 325 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 117 + + + BICOMP + 113 868 117 474 841 134 479 943 850 5 235 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 417 + + + __cstat + 370 + + + BICOMP + 717 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 235 134 138 + + + BICOMP + 113 850 134 38 713 5 235 138 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 627 + + + __cstat + 67 + + + BICOMP + 730 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 457 + + + __cstat + 290 + + + BICOMP + 755 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 868 854 850 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 631 + + + __cstat + 378 + + + BICOMP + 736 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 40 + + + BICOMP + 113 479 850 868 40 943 38 474 841 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 322 + + + __cstat + 377 + + + BICOMP + 616 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 113 854 40 809 464 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 831 + + + __cstat + 285 + + + BICOMP + 92 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 113 138 713 5 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 588 + + + __cstat + 365 + + + BICOMP + 783 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 138 113 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 753 + + + __cstat + 274 + + + BICOMP + 835 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 113 483 117 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 768 + + + __cstat + 287 + + + BICOMP + 866 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 798 + + + __cstat + 270 + + + BICOMP + 733 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 117 + + + BICOMP + 235 483 38 868 479 5 134 117 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 822 + + + __cstat + 71 + + + BICOMP + 105 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 527 + + + __cstat + 68 + + + BICOMP + 605 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 517 + + + __cstat + 73 + + + BICOMP + 341 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 113 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 587 + + + __cstat + 271 + + + BICOMP + 617 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 138 113 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 584 + + + __cstat + 74 + + + BICOMP + 306 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 724 + + + __cstat + 366 + + + BICOMP + 305 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 40 + + + BICOMP + 868 850 113 854 40 809 464 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 334 + + + __cstat + 284 + + + BICOMP + 840 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 113 138 713 5 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 829 + + + __cstat + 277 + + + BICOMP + 90 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 138 713 5 113 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 623 + + + __cstat + 273 + + + BICOMP + 520 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 117 + + + BICOMP + 868 117 474 841 134 479 943 850 5 235 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 495 + + + __cstat + 79 + + + BICOMP + 718 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 113 483 117 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 443 + + + __cstat + 282 + + + BICOMP + 477 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 113 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 674 + + + __cstat + 376 + + + BICOMP + 552 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 138 113 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 433 + + + __cstat + 275 + + + BICOMP + 824 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 758 + + + __cstat + 374 + + + BICOMP + 488 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 426 + + + __cstat + 371 + + + BICOMP + 649 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 134 138 + + + BICOMP + 113 138 483 235 868 479 5 134 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 830 + + + __cstat + 298 + + + BICOMP + 564 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 113 483 117 868 479 5 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 729 + + + __cstat + 289 + + + BICOMP + 406 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 841 868 134 479 943 850 5 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 658 + + + __cstat + 372 + + + BICOMP + 634 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 138 + + + BICOMP + 850 113 138 713 5 474 479 943 841 868 809 483 854 464 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 804 + + + __cstat + 296 + + + BICOMP + 595 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 117 + + + BICOMP + 483 117 868 479 5 113 809 854 850 464 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 481 + + + __cstat + 279 + + + BICOMP + 704 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 479 943 850 5 134 113 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 644 + + + __cstat + 278 + + + BICOMP + 498 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 + + + BICOMP + 474 113 841 868 134 479 943 850 5 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 682 + + + __cstat + 286 + + + BICOMP + 444 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 134 235 + + + BICOMP + 809 464 134 868 854 850 5 235 113 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 734 + + + __cstat + 291 + + + BICOMP + 624 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 461 + + + __cstat + 50 + + + BICOMP + 814 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 38 134 235 + + + BICOMP + 841 474 235 868 38 113 479 943 850 5 134 713 809 483 854 464 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 725 + + + __cstat + 280 + + + BICOMP + 726 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 709 + + + __cstat + 294 + + + BICOMP + 806 + + + + + ICCARM + 5 113 809 850 868 854 713 841 479 943 474 464 483 235 + + + BICOMP + 809 113 464 235 868 854 850 5 483 479 474 943 713 841 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 5 113 630 820 825 593 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 5 113 593 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 5 113 800 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 5 113 825 820 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 5 113 820 630 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 5 113 630 820 825 345 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 5 113 345 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 5 113 630 820 825 738 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 5 113 630 820 825 703 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 5 113 630 820 825 738 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 5 113 738 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 5 113 820 703 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 5 113 653 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 5 113 630 820 825 703 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 5 113 820 703 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 5 113 703 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 5 113 630 820 825 345 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 5 113 820 825 630 345 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 5 113 630 820 825 653 800 703 593 738 345 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 5 113 800 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 5 113 345 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 5 113 703 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 490 749 405 675 807 642 811 499 590 826 315 751 657 632 645 773 430 540 425 504 654 837 560 602 722 777 333 784 109 705 723 534 530 513 597 440 336 472 475 689 320 803 778 788 648 569 818 536 693 456 568 522 549 731 629 765 409 580 391 686 748 785 865 460 412 714 340 663 467 358 403 473 719 699 324 344 437 348 596 353 537 727 332 744 842 635 780 585 782 581 771 843 853 794 781 867 673 416 468 494 591 442 742 620 448 823 363 493 470 774 368 625 583 420 386 832 779 476 435 508 439 491 787 402 601 589 555 338 613 871 469 609 844 858 323 606 410 480 312 660 450 486 851 471 357 692 557 728 745 89 447 330 746 428 432 99 799 395 302 646 343 436 724 322 631 417 426 658 674 334 831 587 588 829 804 798 577 623 495 753 830 758 627 443 668 433 729 584 455 457 768 822 527 517 644 734 461 481 709 682 725 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 5 113 825 820 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 5 113 820 345 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 5 113 593 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 5 113 825 820 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 5 113 630 820 825 653 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 5 113 630 820 825 800 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 5 113 630 820 825 593 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 5 113 820 800 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 5 113 820 630 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 5 113 593 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 5 113 820 825 653 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 5 113 630 820 825 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 5 113 820 825 345 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 5 113 653 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 5 113 820 825 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 5 113 800 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 5 113 825 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 5 113 630 820 825 738 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 5 113 820 825 593 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 5 113 820 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 5 113 820 653 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 5 113 738 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 5 113 820 593 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 5 113 630 820 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 5 113 820 825 800 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 5 113 820 738 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 5 113 820 825 738 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 5 113 820 825 703 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 758 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 457 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 829 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 627 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 768 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 804 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 443 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 822 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 517 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 830 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 644 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 461 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 734 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 623 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 527 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 709 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 682 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 584 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 668 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 588 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 495 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 729 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 455 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 577 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 433 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 587 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 481 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 798 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 831 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 334 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 753 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 340 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 358 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 403 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 748 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 865 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 699 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1011 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 412 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 344 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 332 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 782 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 581 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 843 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 771 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 537 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 794 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 416 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 663 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 853 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 460 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 324 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 468 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 714 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 591 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 442 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 742 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 620 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 781 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1011 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 673 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 785 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 727 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 467 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 686 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1014 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 590 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 405 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 807 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 811 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 749 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 315 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 826 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 632 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 540 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 490 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 430 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 499 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 645 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 425 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 504 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 837 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 560 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 602 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 722 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 657 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 777 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 333 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 675 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 751 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 642 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 773 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 654 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 784 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 109 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 725 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 613 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 493 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 491 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 476 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 435 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 508 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 779 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 439 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 601 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 609 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 555 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 844 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 858 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 368 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 469 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 323 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 363 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 420 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 583 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 832 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 410 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 480 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 448 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 589 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 787 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 338 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 606 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 871 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 470 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 386 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1015 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 447 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 395 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 660 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 450 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 428 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 99 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 302 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 646 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 557 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 471 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 799 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 89 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 343 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 746 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 724 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 322 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 432 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 436 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 417 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 426 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 692 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 357 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 330 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 658 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 674 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1015 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 312 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 631 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 851 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 745 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 486 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1015 1009 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 728 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 1007 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 823 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 402 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 689 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 320 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 818 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 456 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 568 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 648 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 522 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 549 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 440 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 731 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 629 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 723 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 475 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 765 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 705 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1010 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 409 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 580 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 530 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1011 1019 1015 1014 1013 1010 1008 1009 1007 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 472 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 788 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 569 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 536 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 391 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 336 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1019 1016 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 778 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1008 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 597 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 693 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1016 1019 1013 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 513 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1015 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 534 + + + + + ICCARM + 1012 1006 809 850 868 854 713 841 479 943 474 464 483 1049 1051 1011 1019 1008 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 719 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 635 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 780 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 473 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 437 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 348 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 596 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 744 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 585 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 842 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 353 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 867 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 494 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a5/iar/example_build/tx.ewd b/ports/cortex_a5/iar/example_build/tx.ewd new file mode 100644 index 00000000..4173bf74 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a5/iar/example_build/tx.ewp b/ports/cortex_a5/iar/example_build/tx.ewp new file mode 100644 index 00000000..5e6c7287 --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.ewp @@ -0,0 +1,2763 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a5/iar/example_build/tx.ewt b/ports/cortex_a5/iar/example_build/tx.ewt new file mode 100644 index 00000000..d903833d --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx.ewt @@ -0,0 +1,3424 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a5/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a5/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..5369491b --- /dev/null +++ b/ports/cortex_a5/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a5/iar/inc/tx_port.h b/ports/cortex_a5/iar/inc/tx_port.h new file mode 100644 index 00000000..7c107cdf --- /dev/null +++ b/ports/cortex_a5/iar/inc/tx_port.h @@ -0,0 +1,397 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_a5/iar/readme_threadx.txt b/ports/cortex_a5/iar/readme_threadx.txt new file mode 100644 index 00000000..b3b9f85c --- /dev/null +++ b/ports/cortex_a5/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A5 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A5 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A5 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A5 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A5 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5/iar/src/tx_iar.c b/ports/cortex_a5/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a5/iar/src/tx_thread_context_restore.s b/ports/cortex_a5/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..b212254e --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_context_restore.s @@ -0,0 +1,261 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR +#ifdef __D32__ + VSTMDB sp!, {D16-D31} ; Save D16-D31 +#endif + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_context_save.s b/ports/cortex_a5/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..63733553 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..64a1a9eb --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,272 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR +#ifdef __D32__ + VSTMDB sp!, {D16-D31} ; Save D16-D31 +#endif + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..22e2d0c7 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..368cec31 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..00f81c4e --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a5/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..76b0d89c --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b892e436 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..84827bbd --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..755d2280 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..66ff64dd --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_schedule.s b/ports/cortex_a5/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..6c07f922 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_schedule.s @@ -0,0 +1,243 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 +#ifdef __D32__ + VLDMIA sp!, {D16-D31} ; Recover D16-D31 +#endif + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 +#ifdef __D32__ + VLDMIA sp!, {D16-D31} ; Recover D16-D31 +#endif + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_stack_build.s b/ports/cortex_a5/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..efa63ed9 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_system_return.s b/ports/cortex_a5/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..457af6d0 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_system_return.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR +#ifdef __D32__ + VSTMDB sp!, {D16-D31} ; Save D16-D31 +#endif + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..1f363c90 --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a5/iar/src/tx_timer_interrupt.s b/ports/cortex_a5/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d4b8b35f --- /dev/null +++ b/ports/cortex_a5/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject b/ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..5ed0406b --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/.cproject @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/.project b/ports/cortex_a5x/ac6/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml b/ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..dd0920bb --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S new file mode 100644 index 00000000..aaf0f7f8 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.S @@ -0,0 +1,431 @@ +// ------------------------------------------------------------ +// ARMv8-A AArch64 Generic Timer Access Functions +// +// Copyright ARM Ltd 2013. All rights reserved. +// ------------------------------------------------------------ + + + .section AArch64_GenericTimer,"ax" + .align 3 + +// ------------------------------------------------------------ + + .global getCNTFRQ + // uint32_t getCNTFRQ(void) + // Returns the value of CNTFRQ_EL0 + .type getCNTFRQ, @function +getCNTFRQ: + MRS x0, CNTFRQ_EL0 + RET + + +// ------------------------------------------------------------ + + .global setCNTFRQ + // void setCNTFRQ(uint32_t freq) + // Sets the value of CNTFRQ_EL0 (only possible at EL3) + // w0 - freq - The value to be written into CNTFRQ_EL0 + .type setCNTFRQ, @function +setCNTFRQ: + MSR CNTFRQ_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getPhysicalCount + // uint64_t getPhysicalCount(void) + // Returns the current value of physical count (CNTPCT_EL0) + .type getPhysicalCount, @function +getPhysicalCount: + MRS x0, CNTPCT_EL0 + RET + + +// ------------------------------------------------------------ + + .global getVirtualCount + // uint64_t getVirtualCount(void) + // Returns the current value of the virtual count register (CNTVCT_EL0) + .type getVirtualCount, @function +getVirtualCount: + MRS x0, CNTVCT_EL0 + RET + + +// ------------------------------------------------------------ + + .global getEL1Ctrl + // uint32_t getEL1Ctrl(void) + // Returns the value of EL1 Timer Control Register (CNTKCTL_EL1) + .type getEL1Ctrl, @function +getEL1Ctrl: + MRS x0, CNTKCTL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setEL1Ctrl + // void setEL1Ctrl(uint32_t value) + // Sets the value of Counter Non-secure EL1 Control Register (CNTKCTL_EL1) + // 0 - value - The value to be written into CNTKCTL_EL1 + .type setEL1Ctrl, @function +setEL1Ctrl: + MSR CNTKCTL_EL1, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL2Ctrl + // uint32_t getEL2Ctrl(void) + // Returns the value of the EL2 Timer Control Register (CNTHCTL_EL2) + .type getEL2Ctrl, @function +getEL2Ctrl: + MRS x0, CNTHCTL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2Ctrl + // void setEL2Ctrl(uint32_t value) + // Sets the value of the EL2 Timer Control Register (CNTHCTL_EL2) + // x0 - value - The value to be written into CNTHCTL_EL2 + .type setEL2Ctrl, @function +setEL2Ctrl: + MSR CNTHCTL_EL2, x0 + RET + + +// ------------------------------------------------------------ +// Non-Secure Physical Timer +// ------------------------------------------------------------ + + .global getNSEL1PhysicalCompValue + // uint64_t getNSEL1PhysicalCompValue(void) + // Returns the value of Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) + .type getNSEL1PhysicalCompValue, @function +getNSEL1PhysicalCompValue: + MRS x0, CNTP_CVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setNSEL1PhysicalCompValue + // void setNSEL1PhysicalCompValue(uint64_t value) + // Sets the value of the Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) + // x0 - value - The value to be written into CNTP_CVAL_EL0 + .type setNSEL1PhysicalCompValue, @function +setNSEL1PhysicalCompValue: + MSR CNTP_CVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getNSEL1PhysicalTimerValue + // uint32_t getNSEL1PhysicalTimerValue(void) + // Returns the value of Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) + .type getNSEL1PhysicalTimerValue, @function +getNSEL1PhysicalTimerValue: + MRS x0, CNTP_TVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setNSEL1PhysicalTimerValue + // void setNSEL1PhysicalTimerValue(uint32_t value) + // Sets the value of the Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) + // w0 - value - The value to be written into CNTP_TVAL_EL0 + .type setNSEL1PhysicalTimerValue, @function +setNSEL1PhysicalTimerValue: + MSR CNTP_TVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getNSEL1PhysicalTimerCtrl + // uint32_t getNSEL1PhysicalTimerCtrl(void) + // Returns the value of Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) + .type getNSEL1PhysicalTimerCtrl, @function +getNSEL1PhysicalTimerCtrl: + MRS x0, CNTP_CTL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setNSEL1PhysicalTimerCtrl + // void setNSEL1PhysicalTimerCtrl(uint32_t value) + // Sets the value of the Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) + // w0 - value - The value to be written into CNTP_CTL_EL0 + .type setNSEL1PhysicalTimerCtrl, @function +setNSEL1PhysicalTimerCtrl: + MSR CNTP_CTL_EL0, x0 + RET + + +// ------------------------------------------------------------ +// Secure Physical Timer +// ------------------------------------------------------------ + + .global getSEL1PhysicalCompValue + // uint64_t getSEL1PhysicalCompValue(void) + // Returns the value of Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) + .type getSEL1PhysicalCompValue, @function +getSEL1PhysicalCompValue: + MRS x0, CNTPS_CVAL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setSEL1PhysicalCompValue + // void setSEL1PhysicalCompValue(uint64_t value) + // Sets the value of the Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) + // x0 - value - The value to be written into CNTPS_CVAL_EL1 + .type setSEL1PhysicalCompValue, @function +setSEL1PhysicalCompValue: + MSR CNTPS_CVAL_EL1, x0 + RET + + + +// ------------------------------------------------------------ + + .global getSEL1PhysicalTimerValue + // uint32_t getSEL1PhysicalTimerValue(void) + // Returns the value of Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) + .type getSEL1PhysicalTimerValue, @function +getSEL1PhysicalTimerValue: + MRS x0, CNTPS_TVAL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setSEL1PhysicalTimerValue + // void setSEL1PhysicalTimerValue(uint32_t value) + // Sets the value of the Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) + // w0 - value - The value to be written into CNTPS_TVAL_EL1 + .type setSEL1PhysicalTimerValue, @function +setSEL1PhysicalTimerValue: + MSR CNTPS_TVAL_EL1, x0 + RET + + +// ------------------------------------------------------------ + + .global getSEL1PhysicalTimerCtrl + // uint32_t getSEL1PhysicalTimerCtrl(void) + // Returns the value of Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) + .type getSEL1PhysicalTimerCtrl, @function +getSEL1PhysicalTimerCtrl: + MRS x0, CNTPS_CTL_EL1 + RET + + +// ------------------------------------------------------------ + + .global setSEL1PhysicalTimerCtrl + // void setSEL1PhysicalTimerCtrl(uint32_t value) + // Sets the value of the Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) + // w0 - value - The value to be written into CNTPS_CTL_EL1 + .type setSEL1PhysicalTimerCtrl, @function +setSEL1PhysicalTimerCtrl: + MSR CNTPS_CTL_EL1, x0 + RET + + +// ------------------------------------------------------------ + + .global configSecureEL1TimerAccess + // void configSecureEL1TimerAccess(unsigned int config)// + // Sets the values of the SCR_EL3.ST bit (bit 11) based on the value in x0 + // EL3 accessible only! + .type configSecureEL1TimerAccess, @function +configSecureEL1TimerAccess: + MRS x1, SCR_EL3 + BFI x1, x0, #11, #1 + MSR SCR_EL3, x1 + RET + + +// ------------------------------------------------------------ +// Virtual Timer +// ------------------------------------------------------------ + + .global getEL1VirtualCompValue + // uint64_t getEL1VirtualCompValue(void) + // Returns the value of EL1 Virtual Compare Value Register (CNTV_CVAL_EL0) + .type getEL1VirtualCompValue, @function +getEL1VirtualCompValue: + MRS x0, CNTV_CVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setEL1VirtualCompValue + // void setEL1VirtualCompValue(uint64_t value) + // Sets the value of the EL1 Virtual Compare Value Register (CNTV_CVAL_EL0) + // x0 - value - The value to be written into CNTV_CVAL_EL0 + .type setEL1VirtualCompValue, @function +setEL1VirtualCompValue: + MSR CNTV_CVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL1VirtualTimerValue + // uint32_t getEL1VirtualTimerValue(void) + // Returns the value of EL1 Virtual Timer Value Register (CNTV_TVAL_EL0) + .type getEL1VirtualTimerValue, @function +getEL1VirtualTimerValue: + MRS x0, CNTV_TVAL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setEL1VirtualTimerValue + // void setEL1VirtualTimerValue(uint32_t value) + // Sets the value of the EL1 Virtual Timer Value Register (CNTV_TVAL_EL0) + // w0 - value - The value to be written into CNTV_TVAL_EL0 + .type setEL1VirtualTimerValue, @function +setEL1VirtualTimerValue: + MSR CNTV_TVAL_EL0, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL1VirtualTimerCtrl + // uint32_t getEL1VirtualTimerCtrl(void) + // Returns the value of EL1 Virtual Timer Control Register (CNTV_CTL_EL0) + .type getEL1VirtualTimerCtrl, @function +getEL1VirtualTimerCtrl: + MRS x0, CNTV_CTL_EL0 + RET + + +// ------------------------------------------------------------ + + .global setEL1VirtualTimerCtrl + // void setEL1VirtualTimerCtrl(uint32_t value) + // Sets the value of the EL1 Virtual Timer Control Register (CNTV_CTL_EL0) + // w0 - value - The value to be written into CNTV_CTL_EL0 + .type setEL1VirtualTimerCtrl, @function +setEL1VirtualTimerCtrl: + MSR CNTV_CTL_EL0, x0 + RET + + +// ------------------------------------------------------------ +// Virtual Timer functions to be called by EL2 +// ------------------------------------------------------------ + + .global getVirtualCounterOffset + // uint64_t getVirtualCounterOffset(void) + // Returns the value of the Counter Virtual Offset Register (CNTVOFF_EL2) + // EL2 and EL3 only + .type getVirtualCounterOffset, @function +getVirtualCounterOffset: + MRS x0, CNTVOFF_EL2 + RET + + +// ------------------------------------------------------------ + + .global setVirtualCounterOffset + // void setVirtualCounterOffset(uint64_t offset) + // Sets the value of the Counter Virtual Offset Register (CNTVOFF_EL2) + // x0 - offset - The value to be written into CNTVOFF_EL2 + // EL2 and EL3 only + .type setVirtualCounterOffset, @function +setVirtualCounterOffset: + MSR CNTVOFF_EL2, x0 + RET + + +// ------------------------------------------------------------ +// EL2 Physical Timer +// ------------------------------------------------------------ + + .global getEL2PhysicalCompValue + // uint64_t getEL2PhysicalCompValue(void) + // Returns the value of EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) + .type getEL2PhysicalCompValue, @function +getEL2PhysicalCompValue: + MRS x0, CNTHP_CVAL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2PhysicalCompValue + // void setEL2PhysicalCompValue(uint64_t value) + // Sets the value of the EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) + // x0 - value - The value to be written into CNTHP_CVAL_EL2 + .type setEL2PhysicalCompValue, @function +setEL2PhysicalCompValue: + MSR CNTHP_CVAL_EL2, x0 + RET + + + +// ------------------------------------------------------------ + + .global getEL2PhysicalTimerValue + // uint32_t getEL2PhysicalTimerValue(void) + // Returns the value of EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) + .type getEL2PhysicalTimerValue, @function +getEL2PhysicalTimerValue: + MRS x0, CNTHP_TVAL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2PhysicalTimerValue + // void setEL2PhysicalTimerValue(uint32_t value) + // Sets the value of the EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) + // w0 - value - The value to be written into CNTHP_TVAL_EL2 + .type setEL2PhysicalTimerValue, @function +setEL2PhysicalTimerValue: + MSR CNTHP_TVAL_EL2, x0 + RET + + +// ------------------------------------------------------------ + + .global getEL2PhysicalTimerCtrl + // uint32_t getEL2PhysicalTimerCtrl(void) + // Returns the value of EL2 Physical Timer Control Register (CNTHP_CTL_EL2) + .type getEL2PhysicalTimerCtrl, @function +getEL2PhysicalTimerCtrl: + MRS x0, CNTHP_CTL_EL2 + RET + + +// ------------------------------------------------------------ + + .global setEL2PhysicalTimerCtrl + // void setEL2PhysicalTimerCtrl(uint32_t value) + // Sets the value of the EL2 Physical Timer Control Register (CNTHP_CTL_EL2) + // w0 - value - The value to be written into CNTHP_CTL_EL2 + .type setEL2PhysicalTimerCtrl, @function +setEL2PhysicalTimerCtrl: + MSR CNTHP_CTL_EL2, x0 + RET + + +// ------------------------------------------------------------ +// End of code +// ------------------------------------------------------------ diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h new file mode 100644 index 00000000..63474ac8 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/armv8_aarch64_SystemTimer.h @@ -0,0 +1,206 @@ +// ------------------------------------------------------------ +// ARMv8-A AArch64 System Timer +// Header Filer +// +// Copyright ARM Ltd 2013. All rights reserved. +// ------------------------------------------------------------ + +#ifndef _ARMV8A_SYSTEM_TIMER_H +#define _ARMV8A_SYSTEM_TIMER_H + +// ------------------------------------------------------------ +// CNTFRQ holds the frequency of the system counter +// Readable in all ELs +// Writable only by EL3 + +// Returns the value of CNTFRQ_EL0 +unsigned int getCNTFRQ(void); + +// Sets the value of CNTFRQ_EL0 (EL3 only!) +// freq - The value to be written into CNTFRQ_EL3 +void setCNTFRQ(unsigned int freq); + +// ------------------------------------------------------------ +// CNTPCT_EL0 and CNTVCT_EL0 hold the physical and virtual counts +// Always accessable in Hpy and Secure EL1 +// Access from EL2 and Non-Secure EL1 is configurable + +// Returns the current value of physical count (CNTPCT_EL0) +unsigned long long getPhysicalCount(void); + +// Returns the current value of the virtual count register (CNTVCT_EL0) +unsigned long long getVirtualCount(void); + +// ------------------------------------------------------------ +// The CNTKCTL register controls whether CNTPCT can be accessed from EL0 +// Only acceable from EL1 and EL2 + +#define CNTKCTL_PCTEN (1 << 0) // Controls whether the physical counter, CNTPCT, and the frequency register CNTFRQ, are accessible from EL0 +#define CNTKCTL_VCTEN (1 << 1) // Controls whether the virtual counter, CNTVCT, and the frequency register CNTFRQ, are accessible from +#define CNTKCTL_EVNTEN (1 << 2) // Enables the generation of an event stream from the virtual counter +#define CNTKCTL_EVNTDIR (1 << 3) // Controls which transition of the CNTVCT trigger bit, defined by EVNTI, generates an event + +// Returns the value of EL1 Timer Control Register (CNTKCTL_EL1) +unsigned int getEL1Ctrl(void); + +// Sets the value of EL1 Timer Control Register (CNTKCTL_EL1) +// value - The value to be written into CNTKCTL_EL1 +void setEL1Ctrl(unsigned int value); + +// ------------------------------------------------------------ +// The CNTHCTL_EL2 register controls whether CNTPCT_EL0 can be accessed from EL1 +// Only accessable from EL2 and EL3 + +#define CNTHCTL_CNTPCT (1 << 0) +#define CNTHCTL_EVNTEN (1 << 2) +#define CNTHCTL_EVNTDIR (1 << 3) + +// Returns the value of the EL2 Timer Control Register (CNTHCTL_EL2) +unsigned int getEL2Ctrl(void); + +// Sets the value of EL2 Timer Control Register (CNTHCTL_EL2) +// value - The value to be written into CNTHCTL_EL2 +void setEL2Ctrl(unsigned int value); + +// ------------------------------------------------------------ +// Non-Secure Physical Timer +// ------------------------------------------------------------ +// Accessible from EL3, EL2 and EL1 + +// Returns the value of Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) +unsigned long long getNSEL1PhysicalCompValue(void); + +// Sets the value of the Non-Secure EL1 Physical Compare Value Register (CNTP_CVAL_EL0) +// value - The value to be written into CNTP_CVAL_EL0 +void setNSEL1PhysicalCompValue(unsigned long long value); + +// Returns the value of Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) +unsigned int getNSEL1PhysicalTimerValue(void); + +// Sets the value of the Non-Secure EL1 Physical Timer Value Register (CNTP_TVAL_EL0) +// value - The value to be written into CNTP_TVAL_EL0 +void setNSEL1PhysicalTimerValue(unsigned int value); + +#define CNTP_CTL_ENABLE (1 << 0) +#define CNTP_CTL_MASK (1 << 1) +#define CNTP_CTL_STATUS (1 << 2) + +// Returns the value of Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) +unsigned int getNSEL1PhysicalTimerCtrl(void); + +// Sets the value of the Non-Secure EL1 Physical Timer Control Register (CNTP_CTL_EL0) +// value - The value to be written into CNTP_CTL_EL0 +void setNSEL1PhysicalTimerCtrl(unsigned int value); + +// ------------------------------------------------------------ +// Secure Physical Timer +// ------------------------------------------------------------ +// Accessible from EL3, and configurably from secure EL1 + +// Returns the value of Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) +unsigned long long getSEL1PhysicalCompValue(void); + +// Sets the value of the Secure EL1 Physical Compare Value Register (CNTPS_CVAL_EL1) +// value - The value to be written into CNTPS_CVAL_EL1 +void setSEL1PhysicalCompValue(unsigned long long value); + +// Returns the value of Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) +unsigned int getSEL1PhysicalTimerValue(void); + +// Sets the value of the Secure EL1 Physical Timer Value Register (CNTPS_TVAL_EL1) +// value - The value to be written into CNTPS_TVAL_EL1 +void setSEL1PhysicalTimerValue(unsigned int value); + +#define CNTPS_CTL_ENABLE (1 << 0) +#define CNTPS_CTL_MASK (1 << 1) +#define CNTPS_CTL_STATUS (1 << 2) + +// Returns the value of Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) +unsigned int getSEL1PhysicalTimerCtrl(void); + +// Sets the value of the Secure EL1 Physical Timer Control Register (CNTPS_CTL_EL1) +// value - The value to be written into CNTPS_CTL_EL1 +void setSEL1PhysicalTimerCtrl(unsigned int value); + +// The SCR_EL3 register controls whether CNTPS_TVAL_EL1, +// CNTPS_CTL_EL1, and CNTPS_CVAL_EL1 can be accessed by secure +// EL1. +// Only accessible from EL3 + +#define SCR_ENABLE_SECURE_EL1_ACCESS (1) +#define SCR_DISABLE_SECURE_EL1_ACCESS (0) + +// Sets the values of the SCR_EL3.ST bit (bit 11) based on the value passed in 'config' +void configSecureEL1TimerAccess(unsigned int config); + +// ------------------------------------------------------------ +// Virtual Timer +// ------------------------------------------------------------ +// Accessible from Non-Secure EL1 and EL2 + +// Returns the value of EL1 Virtual Compare Value Register (CNTV_CVAL) +unsigned long long getEL1VirtualCompValue(void); + +// Sets the value of the EL1 Virtual Compare Value Register (CNTV_CVAL) +// value - The value to be written into CNTV_CVAL +void setEL1VirtualCompValue(unsigned long long value); + +// Returns the value of EL1 Virtual Timer Value Register (CNTV_TVAL) +unsigned int getEL1VirtualTimerValue(void); + +// Sets the value of the EL1 Virtual Timer Value Register (CNTV_TVAL) +// value - The value to be written into CNTV_TVAL +void setEL1VirtualTimerValue(unsigned int value); + +#define CNTV_CTL_ENABLE (1 << 0) +#define CNTV_CTL_MASK (1 << 1) +#define CNTV_CTL_STATUS (1 << 2) + +// Returns the value of EL1 Virtual Timer Control Register (CNTV_CTL) +unsigned int getEL1VirtualTimerCtrl(void); + +// Sets the value of the EL1 Virtual Timer Control Register (CNTV_CTL) +// value - The value to be written into CNTV_CTL +void setEL1VirtualTimerCtrl(unsigned int value); + +// +// Virtual timer functions to be called by EL2 +// + +// CNTVCT_EL2 holds the offset the virtual count is from the physical count +// Only accessable from EL2 and EL3 + +// Returns the value of the Counter Virtual Offset Register (CNTVOFF_EL2) +unsigned long long getVirtualCounterOffset(void); + +// Sets the value of the Counter Virtual Offset Register (CNTVOFF_EL2) +// offset - The value to be written into CNTVOFF_EL2 +void setVirtualCounterOffset(unsigned long long offset); + +// ------------------------------------------------------------ +// Hypervisor (EL2) Timer +// ------------------------------------------------------------ + +// Returns the value of EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) +unsigned long long getEL2PhysicalCompValue(void); + +// Sets the value of the EL2 Physical Compare Value Register (CNTHP_CVAL_EL2) +// value - The value to be written into CNTHP_CVAL_EL2 +void setEL2PhysicalCompValue(unsigned long long value); + +// Returns the value of EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) +unsigned int getEL2PhysicalTimerValue(void); + +#define CNTHP_CTL_ENABLE (1 << 0) +#define CNTHP_CTL_MASK (1 << 1) +#define CNTHP_CTL_STATUS (1 << 2) + +// Sets the value of the EL2 Physical Timer Value Register (CNTHP_TVAL_EL2) +// value - The value to be written into CNTHP_TVAL_EL2 +void setEL2PhysicalTimerValue(unsigned int value); + +#endif + +// ------------------------------------------------------------ +// End of armv8_aarch64_SystemTimer.h +// ------------------------------------------------------------ diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S b/ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S new file mode 100644 index 00000000..7f4effe7 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/el3_vectors.S @@ -0,0 +1,138 @@ +// ------------------------------------------------------------ +// Exceptions workbook exercise +// +// Copyright ARM LTD, 2012 +// ------------------------------------------------------------ + + .section VECTORS,"ax" + .align 12 + + + .global el3_vectors +el3_vectors: + + .global fiqHandler + .global irqHandler + +// ------------------------------------------------------------ +// Current EL with SP0 +// ------------------------------------------------------------ + .balign 128 +sync_current_el_sp0: + B . // Synchronous + + .balign 128 +irq_current_el_sp0: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_current_el_sp0: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_current_el_sp0: + B . // SError + +// ------------------------------------------------------------ +// Current EL with SPx +// ------------------------------------------------------------ + + .balign 128 +sync_current_el_spx: + B . // Synchronous + + .balign 128 +irq_current_el_spx: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_current_el_spx: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_current_el_spx: + B . // SError + +// ------------------------------------------------------------ +// Lower EL using AArch64 +// ------------------------------------------------------------ + + .balign 128 +sync_lower_el_aarch64: + B . + + .balign 128 +irq_lower_el_aarch64: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_lower_el_aarch64: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_lower_el_aarch64: + B . // SError + +// ------------------------------------------------------------ +// Lower EL using AArch32 +// ------------------------------------------------------------ + + .balign 128 +sync_lower_el_aarch32: + B . + + .balign 128 +irq_lower_el_aarch32: + B irqFirstLevelHandler // IRQ + + .balign 128 +fiq_lower_el_aarch32: + B fiqFirstLevelHandler // FIQ + + .balign 128 +serror_lower_el_aarch32: + B . // SError + + +// ------------------------------------------------------------ + +irqFirstLevelHandler: + STP x29, x30, [sp, #-16]! + BL _tx_thread_context_save + + BL irqHandler + + B _tx_thread_context_restore + +fiqFirstLevelHandler: + STP x29, x30, [sp, #-16]! + STP x18, x19, [sp, #-16]! + STP x16, x17, [sp, #-16]! + STP x14, x15, [sp, #-16]! + STP x12, x13, [sp, #-16]! + STP x10, x11, [sp, #-16]! + STP x8, x9, [sp, #-16]! + STP x6, x7, [sp, #-16]! + STP x4, x5, [sp, #-16]! + STP x2, x3, [sp, #-16]! + STP x0, x1, [sp, #-16]! + + BL fiqHandler + + LDP x0, x1, [sp], #16 + LDP x2, x3, [sp], #16 + LDP x4, x5, [sp], #16 + LDP x6, x7, [sp], #16 + LDP x8, x9, [sp], #16 + LDP x10, x11, [sp], #16 + LDP x12, x13, [sp], #16 + LDP x14, x15, [sp], #16 + LDP x16, x17, [sp], #16 + LDP x18, x19, [sp], #16 + LDP x29, x30, [sp], #16 + ERET + +// ------------------------------------------------------------ +// End of file +// ------------------------------------------------------------ + diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c new file mode 100644 index 00000000..1ecd5f33 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.c @@ -0,0 +1,419 @@ +// ---------------------------------------------------------- +// GIC400 - Generic Interrupt Controller +// +// GIC Exercise +// ---------------------------------------------------------- + +#include "gic400_gic.h" + +struct gic400_dist_if +{ + volatile unsigned int GICD_CTLR; // +0x000 - RW - Distributor Control Register + const volatile unsigned int GICD_TYPRE; // +0x004 - RO - Interrupt Controller Type Register + const volatile unsigned int GICD_IIDR; // +0x008 - RO - Distributor Implementer Identification Register + + const volatile unsigned int padding0[29]; + + volatile unsigned int GICD_IGROUPR[32]; // +0x080 - RW - Interrupt Groupt Registers (Security Registers in GICv1) + + volatile unsigned int GICD_ISENABLER[32]; // +0x100 - RW - Interrupt Set-Enable Registers + volatile unsigned int GICD_ICENABLER[32]; // +0x180 - RW - Interrupt Clear-Enable Registers + volatile unsigned int GICD_ISPENDR[32]; // +0x200 - RW - Interrupt Set-Pending Registers + volatile unsigned int GICD_ICPENDR[32]; // +0x280 - RW - Interrupt Clear-Pending Registers + volatile unsigned int GICD_ISACTIVER[32]; // +0x300 - RW - Interrupt Set-Active Register + volatile unsigned int GICD_ICACTIVER[32]; // +0x380 - RW - Interrupt Clear-Active Register + + volatile unsigned char GICD_IPRIORITYR[1024]; // +0x400 - RW - Interrupt Priority Registers + volatile unsigned int GICD_ITARGETSR[256]; // +0x800 - RW - Interrupt Processor Targets Registers + volatile unsigned int GICD_ICFGR[64]; // +0xC00 - RW - Interrupt Configuration Registers + + const volatile unsigned int padding2[128]; + + volatile unsigned int GICD_SGIR; // +0xF00 - WO - Software Generated Interrupt Register + +}; + +struct gic400_physical_cpu_if +{ + volatile unsigned int GICC_CTLR; // +0x000 - RW - CPU Interface Control Register + volatile unsigned int GICC_PMR; // +0x004 - RW - Interrupt Priority Mask Register + volatile unsigned int GICC_BPR; // +0x008 - RW - Binary Point Register + const volatile unsigned int GICC_IAR; // +0x00C - RO - Interrupt Acknowledge Register + volatile unsigned int GICC_EOIR; // +0x010 - WO - End of Interrupt Register + const volatile unsigned int GICC_RPR; // +0x014 - RO - Running Priority Register + const volatile unsigned int GICC_HPPIR; // +0x018 - RO - Highest Pending Interrupt Register + volatile unsigned int GICC_ABPR; // +0x01C - RW - Aliased Binary Point Register + const volatile unsigned int GICC_AIAR; // +0x020 - RO - Aliased Interrupt Acknowledge Register + volatile unsigned int GICC_AEOIR; // +0x024 - WO - Aliased End of Interrupt Register + const volatile unsigned int GICC_AHPPIR; // +0x028 - RO - Aliased Highest Pending Interrupt Register + + const volatile unsigned int padding0[52]; + + const volatile unsigned int GICC_IIDR; // +0x0FC - RO - CPU Interface Identification Register +}; + +struct gic400_dist_if* gic_dist; +struct gic400_physical_cpu_if* gic_cpu; + + +// ------------------------------------------------------------ + +void setGICAddr(void* dist, void* cpu) +{ + gic_dist = (struct gic400_dist_if*)dist; + gic_cpu = (struct gic400_physical_cpu_if*)cpu; + return; +} + +// ------------------------------------------------------------ + +// Global enable of the Interrupt Distributor +void enableGIC(void) +{ + gic_dist->GICD_CTLR = 3; + return; +} + +// Global disable of the Interrupt Distributor +void disableGIC(void) +{ + gic_dist->GICD_CTLR = 0; + return; +} + +// ------------------------------------------------------------ + +// Enables the interrupt source number ID +void enableIntID(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ISENABLER[bank] = ID; + + return; +} + +// Disables the interrupt source number ID +void disableIntID(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ICENABLER[bank] = ID; + + return; +} + +// ------------------------------------------------------------ + +// Sets the priority of the specified ID +void setIntPriority(unsigned int ID, unsigned int priority) +{ + if (ID > 1020) // Check ID in range + return; + + // The priority registers allows byte accesses + // meaning using a char array we can directly + // reference the correct entry + gic_dist->GICD_IPRIORITYR[ID] = priority; + + return; +} + +// Returns the priority of the specified ID +unsigned int getIntPriority(unsigned int ID) +{ + if (ID > 1020) // Check ID in range + return 0; + + return gic_dist->GICD_IPRIORITYR[ID]; +} + +// ------------------------------------------------------------ + +// Sets the target CPUs of the specified ID +// For 'target' use one of the above defines +void setIntTarget(unsigned int ID, unsigned int target) +{ + unsigned int bank, tmp; + + target = target & 0xFF; // Target field is 8-bits, mask off unused bit + bank = ID/4; // There are 4 IDs per register, need to work out which register to access + ID = ID & 0x3; // ... and which field within the register + ID = ID * 8; // Convert from which field to a bit offset (8-bits per field) + + target = target << ID; // Move prioity value into correct bit position + + tmp = gic_dist->GICD_ITARGETSR[bank]; // Read the current value in the register + tmp = tmp & ~(0xFF << ID); // Blank out the field holding the value we're modifying + tmp = tmp | target; // OR in the new target + gic_dist->GICD_ITARGETSR[bank] = tmp; + + return; +} + +// Returns the target CPUs of the specified ID +unsigned int getIntTarget(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/4; // There are 4 IDs per register, need to work out which register to access + ID = ID & 0x3; // ... and which field within the register + ID = ID * 8; // Convert from which field to a bit offset (8-bits per field) + + tmp = gic_dist->GICD_ITARGETSR[bank]; + + tmp = tmp >> ID; // Shift desired field to bit position 0 + tmp = tmp & 0xFF; // Mask off the other bits + + return tmp; +} + +// ---------------------------------------------------------- + +// Configures the specified ID as being level or edge triggered +void configureSPI(unsigned int ID, unsigned int conf) +{ + unsigned int bank, tmp; + + conf = conf & 0x3; // Mask out unused bits + + bank = ID/16; // There are 16 IDs per register, need to work out which register to access + ID = ID & 0xF; // ... and which field within the register + ID = ID * 2; // Convert from which field to a bit offset (2-bits per field) + + conf = conf << ID; // Move configuration value into correct bit position + + tmp = gic_dist-> GICD_ICFGR[bank]; // Read current vlase + tmp = tmp & ~(0x3 << ID); // Clear the bits for the specified field + tmp = tmp | conf; // OR in new configuration + gic_dist-> GICD_ICFGR[bank] = tmp; // Write updated value back + + return; +} + +// ---------------------------------------------------------- + +// Sets the pending bit of the specified ID +void setIntPending(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ISPENDR[bank] = ID; + + return; +} + +// Clears the pending bit of the specified ID +void clearIntPending(unsigned int ID) +{ + unsigned int bank; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + gic_dist->GICD_ICPENDR[bank] = ID; + + return; +} + +// Returns the value of the status bit of the specifed ID +unsigned int getIntPending(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + tmp = gic_dist->GICD_ICPENDR[bank]; // Read the register containing the ID we are interested in + tmp = tmp >> ID; // Shift the status bit for specified ID to position 0 + tmp = tmp & 0x1; // Mask off the rest of the register + + return tmp; +} + +// ------------------------------------------------------------ + +// Send a software generate interrupt +void sendSGI(unsigned int ID, unsigned int cpu_list, unsigned int filter_list, unsigned int SATT) +{ + // Ensure unused bits are clear, and shift into correct bit position + ID = ID & 0xF; + SATT = (SATT & 0x1) << 15; + cpu_list = (cpu_list & 0xFF) << 16; + filter_list = (filter_list & 0x3) << 24; + + // Combine fields + ID = ID | SATT | cpu_list | filter_list; + + gic_dist->GICD_SGIR = ID; + + return; +} + +// ------------------------------------------------------------ + +// Sets the specified ID as secure +void makeIntGroup0(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + ID = ~ID; // Invert to get mask + + tmp = gic_dist->GICD_IGROUPR[bank]; // Read current value + tmp = tmp & ID; + gic_dist->GICD_IGROUPR[bank] = tmp; + + return; +} + +// Set the specified ID as non-secure +void makeIntGroup1(unsigned int ID) +{ + unsigned int bank, tmp; + + bank = ID/32; // There are 32 IDs per register, need to work out which register to access + ID = ID & 0x1f; // ... and which bit within the register + + ID = 1 << ID; // Move a '1' into the correct bit position + + tmp = gic_dist->GICD_IGROUPR[bank]; // Read current value + tmp = tmp | ID; // Or with bit mask to set the bit + gic_dist->GICD_IGROUPR[bank] = tmp; // Write-back +} + +// Returns the security of the specified ID +unsigned int getIntGroup(unsigned int ID) +{ + // TBD + return 0; +} + +// ------------------------------------------------------------ +// CPU Interface functions +// ------------------------------------------------------------ + +// Enables the CPU interface +// Must been done one each core seperately +void enableCPUInterface(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0x1; // Set bit 0 + gic_cpu->GICC_CTLR = tmp; +} + +// Enables the group 1 (non-secure) CPU interface +// This function can only be called from the Secure world +// Must been done one each core seperately +void enableNonSecureCPUInterface(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0x2; // Set bit 1 + gic_cpu->GICC_CTLR = tmp; +} + +// Disables the processor interface +void disableCPUInterface(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp & 0xFFFFFFFFE; // Clear bit 0 + gic_cpu->GICC_CTLR = tmp; +} + +// Enables the sending of secure interrupts as FIQs +void enableSecureFIQs(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0x8; // Set bit 3 + gic_cpu->GICC_CTLR = tmp; +} + +// Disables the sending of secure interrupts as FIQs +void disableSecureFIQs(void) +{ + unsigned int tmp; + + tmp = gic_cpu->GICC_CTLR; + tmp = tmp | 0xFFFFFFFF7; // Clear bit 3 + gic_cpu->GICC_CTLR = tmp; +} + +// Returns the value of the Interrupt Acknowledge Register +unsigned int readIntAck(void) +{ + return gic_cpu->GICC_IAR; +} + +// Writes ID to the End Of Interrupt register +void writeEOI(unsigned int ID) +{ + gic_cpu->GICC_EOIR = ID; + return; +} + +// Returns the value of the Aliased Interrupt Acknowledge Register +unsigned int readAliasedIntAck(void) +{ + return gic_cpu->GICC_AIAR; +} + +// Writes ID to the Aliased End Of Interrupt register +void writeAliasedEOI(unsigned int ID) +{ + gic_cpu->GICC_AEOIR = ID; + return; +} + +// Sets the Priority mask register for the core run on +// The reset value masks ALL interrupts! +void setPriorityMask(unsigned int priority) +{ + gic_cpu->GICC_PMR = (priority & 0xFF); + return; +} + +// Sets the Binary Point Register for the core run on +void setBinaryPoint(unsigned int priority) +{ + gic_cpu->GICC_BPR = (priority & 0xFF); + return; +} + +// Sets the Aliased Binary Point Register for the core run on +void setAliasedBinaryPoint(unsigned int priority) +{ + gic_cpu->GICC_ABPR = (priority & 0xFF); + return; +} + +// ------------------------------------------------------------ +// End of gic400_gic.c +// ------------------------------------------------------------ diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h new file mode 100644 index 00000000..aca064c3 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/gic400_gic.h @@ -0,0 +1,192 @@ +// ---------------------------------------------------------- +// GIC400 - Generic Interrupt Controller +// Header +// +// Martin Weidmann Dec 2011 +// ---------------------------------------------------------- + +#ifndef __gic400_gic_h +#define __gic400_gic_h + +#define GIC_GIC400_PPI0 (0) +#define GIC_GIC400_PPI1 (1) +#define GIC_GIC400_PPI2 (2) +#define GIC_GIC400_PPI3 (3) +#define GIC_GIC400_PPI4 (4) +#define GIC_GIC400_PPI5 (5) +#define GIC_GIC400_PPI6 (6) +#define GIC_GIC400_PPI7 (7) +#define GIC_GIC400_PPI8 (8) +#define GIC_GIC400_PPI9 (9) +#define GIC_GIC400_PPI10 (10) +#define GIC_GIC400_PPI11 (11) +#define GIC_GIC400_PPI12 (12) +#define GIC_GIC400_PPI13 (13) +#define GIC_GIC400_PPI14 (14) +#define GIC_GIC400_PPI15 (15) +#define GIC_GIC400_PPI16 (16) +#define GIC_GIC400_PPI17 (17) +#define GIC_GIC400_PPI18 (18) +#define GIC_GIC400_PPI19 (19) +#define GIC_GIC400_PPI20 (20) +#define GIC_GIC400_PPI21 (21) +#define GIC_GIC400_PPI22 (22) +#define GIC_GIC400_PPI23 (23) +#define GIC_GIC400_PPI24 (24) +#define GIC_GIC400_PPI25 (25) +#define GIC_GIC400_PPI26 (26) +#define GIC_GIC400_PPI27 (27) +#define GIC_GIC400_PPI28 (28) +#define GIC_GIC400_PPI29 (29) +#define GIC_GIC400_PPI30 (30) +#define GIC_GIC400_PPI31 (31) + +// ---------------------------------------------------------- + +// Sets the address of the GIC's distributor and CPU interfaces +void setGICAddr(void* dist, void* cpu); + +// ---------------------------------------------------------- + +// Global enable of the Interrupt Distributor +void enableGIC(void); + +// Global disable of the Interrupt Distributor +void disableGIC(void); + +// ---------------------------------------------------------- + +// Enables the interrupt source number ID +void enableIntID(unsigned int ID); + +// Disables the interrupt source number ID +void disableIntID(unsigned int ID); + +// ---------------------------------------------------------- + +// Sets the priority of the specified ID +void setIntPriority(unsigned int ID, unsigned int priority); + +// Returns the priority of the specified ID +unsigned int getIntPriority(unsigned int ID); + +// ---------------------------------------------------------- + +#define GIC_GIC400_TARGET_CPU0 (0x01) +#define GIC_GIC400_TARGET_CPU1 (0x02) +#define GIC_GIC400_TARGET_CPU2 (0x04) +#define GIC_GIC400_TARGET_CPU3 (0x08) +#define GIC_GIC400_TARGET_CPU4 (0x10) +#define GIC_GIC400_TARGET_CPU5 (0x20) +#define GIC_GIC400_TARGET_CPU6 (0x40) +#define GIC_GIC400_TARGET_CPU7 (0x80) + +// Sets the target CPUs of the specified ID +// For 'target' use one of the above defines +void setIntTarget(unsigned int ID, unsigned int target); + +// Returns the target CPUs of the specified ID +unsigned int getIntTarget(unsigned int ID); + +// ---------------------------------------------------------- + +#define GIC_GIC400_CONFIG_LEVEL (0) +#define GIC_GIC400_CONFIG_EDGE (2) + +// Configures the specified ID as being level or edge triggered + +void configureSPI(unsigned int ID, unsigned int conf); + +// ---------------------------------------------------------- + +// Sets the pending bit of the specified ID +void setIntPending(unsigned int ID); + +// Clears the pending bit of the specified ID +void clearIntPending(unsigned int ID); + +#define GIC_GIC400_PENDING_IS_SET (1) +#define GIC_GIC400_PENDING_IS_CLEAR (0) + +// Returns the value of the status bit of the specified ID +unsigned int getIntPending(unsigned int ID); + +// ---------------------------------------------------------- + +#define GIC_GIC400_SGI_SECURE (0) +#define GIC_GIC400_SGI_NONSECURE (1) +#define GIC_GIC400_SGI_FILTER_USE_LIST (0) +#define GIC_GIC400_SGI_FILTER_NOT_THIS_CPU (1) +#define GIC_GIC400_SGI_FILTER_THIS_CPU (2) +#define GIC_GIC400_SGI_CPU0 (0x01) +#define GIC_GIC400_SGI_CPU1 (0x02) +#define GIC_GIC400_SGI_CPU2 (0x04) +#define GIC_GIC400_SGI_CPU3 (0x08) +#define GIC_GIC400_SGI_CPU4 (0x10) +#define GIC_GIC400_SGI_CPU5 (0x20) +#define GIC_GIC400_SGI_CPU6 (0x40) +#define GIC_GIC400_SGI_CPU7 (0x80) + +// Send a software generate interrupt +void sendSGI(unsigned int ID, unsigned int cpu_list, unsigned int filter_list, unsigned int SATT); + +// ---------------------------------------------------------- + +// Sets the specified ID as secure +void makeIntGroup0(unsigned int ID); + +// Set the specified ID as non-secure +void makeIntGroup1(unsigned int ID); + +// Returns the security of the specified ID +unsigned int getIntGroup(unsigned int ID); + +// ------------------------------------------------------------ +// CPU Interface functions +// ------------------------------------------------------------ + +// Enables the processor interface +// Must been done one each core seperately +void enableCPUInterface(void); + +// Enables the group 1 (non-secure) CPU interface +// This function can only be called from the Secure world +// Must been done one each core seperately +void enableNonSecureCPUInterface(void); + +// Disables the processor interface +void disableCPUInterface(void); + +// Enables the sending of secure interrupts as FIQs +void enableSecureFIQs(void); + +// Disables the sending of secure interrupts as FIQs +void disableSecureFIQs(void); + +// Returns the value of the Interrupt Acknowledge Register +unsigned int readIntAck(void); + +// Writes ID to the End Of Interrupt register +void writeEOI(unsigned int ID); + +// Returns the value of the Aliased Interrupt Acknowledge Register +unsigned int readAliasedIntAck(void); + +// Writes ID to the Aliased End Of Interrupt register +void writeAliasedEOI(unsigned int ID); + +// Sets the Priority mask register for the core run on +// The reset value masks ALL interrupts! +void setPriorityMask(unsigned int priority); + +// Sets the Binary Point Register for the core run on +void setBinaryPoint(unsigned int priority); + +// Sets the Aliased Binary Point Register for the core run on +void setAliasedBinaryPoint(unsigned int priority); + +#endif + +// ---------------------------------------------------------- +// End of gic400_gic.h +// ---------------------------------------------------------- diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c b/ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c new file mode 100644 index 00000000..dc19cd3b --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/hw_setup.c @@ -0,0 +1,104 @@ +// +// Copyright ARM LTD, 2013 + +#include +#include "gic400_gic.h" +#include "armv8_aarch64_SystemTimer.h" +#include "tx_api.h" + + +void _tx_timer_interrupt(void); + + + +// -------------------------------------------------------- + +void hw_setup(void) +{ + long long current_time; + + + setGICAddr((void*)0x2C001000, (void*)0x2C002000); + + // + // Configure interrupt controller (GICv2 assumed) + // + enableGIC(); + enableCPUInterface(); + enableNonSecureCPUInterface(); + setPriorityMask(0xFF); + enableSecureFIQs(); + + // Secure Physical Timer (ID 29) + enableIntID(29); + setIntPriority(29, 0); + makeIntGroup0(29); + + // Non-Secure Physical Timer (ID 30) + enableIntID(30); + setIntPriority(30, 0); + makeIntGroup1(30); + + + // + // Configure timer + // + configSecureEL1TimerAccess(SCR_ENABLE_SECURE_EL1_ACCESS); + + current_time = getPhysicalCount(); + + // Configure the Secure Physical Timer + setSEL1PhysicalCompValue(current_time + 10000); + setSEL1PhysicalTimerCtrl(CNTPS_CTL_ENABLE); + + // Configure the Non-Secure Physical Timer + setNSEL1PhysicalCompValue(current_time + 20000); + setNSEL1PhysicalTimerCtrl(CNTP_CTL_ENABLE); + + + // NOTE: + // This code assumes that the IRQ and FIQ exceptions + // have been routed to the appropriate EL. In this + // example that is done in the startup.s file +} + + +// -------------------------------------------------------- + +void fiqHandler(void) +{ + unsigned int ID; + +// printf("Hello from the FIQ handler\n"); + + ID = readIntAck(); + setSEL1PhysicalTimerCtrl(0); // Disable timer to clear interrupt + writeEOI(ID); + + return; +} + +// -------------------------------------------------------- + +void irqHandler(void) +{ + unsigned int ID; + unsigned long long current_time; + +// printf("Hello from the IRQ handler\n"); + + ID = readAliasedIntAck(); + setNSEL1PhysicalTimerCtrl(0); // Disable timer to clear interrupt + writeAliasedEOI(ID); + + current_time = getPhysicalCount(); + setNSEL1PhysicalCompValue(current_time + 20000); + setNSEL1PhysicalTimerCtrl(CNTP_CTL_ENABLE); + + //tx_thread_resume(&thread_1); + _tx_timer_interrupt(); + + return; +} + +// -------------------------------------------------------- diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..db5318f0 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,381 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include + +#define DEMO_STACK_SIZE 2048 +#define DEMO_BYTE_POOL_SIZE 64000 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define board-specific hardware setup. */ + +void hw_setup(void); + + +/* Define main entry point. */ + +int main() +{ + + /* Setup hardware. */ + hw_setup(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +UCHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt new file mode 100644 index 00000000..90c80d28 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/sample_threadx.txt @@ -0,0 +1,15 @@ +LOAD 0x80000000 +{ + BASE 0x80000000 + { + * (+RO) + } + + RAM +0x0 + { + * (+RW, +ZI) + } + + ARM_LIB_STACKHEAP 0x80090000 EMPTY -0x00040000 + {} +} \ No newline at end of file diff --git a/ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S b/ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S new file mode 100644 index 00000000..8b1f8f3b --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/sample_threadx/startup.S @@ -0,0 +1,199 @@ +//================================================================== +// Copyright ARM Ltd 2012. All rights reserved. +// +// ARMv8 example - Startup Code +//================================================================== + + .section BOOT,"ax" + .align 3 + +// ------------------------------------------------------------ + +.equ Mode_USR, 0x10 + +.equ AArch32_Mode_USR, 0x10 +.equ AArch32_Mode_FIQ, 0x11 +.equ AArch32_Mode_IRQ, 0x12 +.equ AArch32_Mode_SVC, 0x13 +.equ AArch32_Mode_ABT, 0x17 +.equ AArch32_Mode_UNDEF, 0x1B +.equ AArch32_Mode_SYS, 0x1F +.equ AArch32_Mode_HYP, 0x1A +.equ AArch32_Mode_MON, 0x16 + +.equ AArch64_EL2_SP2, 0x09 // EL2h +.equ AArch64_EL2_SP0, 0x08 // EL2t +.equ AArch64_EL1_SP1, 0x05 // EL1h +.equ AArch64_EL1_SP0, 0x04 // EL1t +.equ AArch64_EL0_SP0, 0x00 + +.equ AArch32_State_Thumb, 0x20 +.equ AArch32_State_ARM, 0x00 + +// ------------------------------------------------------------ + +.equ TT_S1_TABLE, 0x00000000000000003 // NSTable=0, PXNTable=0, UXNTable=0, APTable=0 + +// TT block entries templates (L1 and L2, NOT L3) +// Assuming table contents: +// 0 = b01000100 = Normal, Inner/Outer Non-Cacheable +// 1 = b11111111 = Normal, Inner/Outer WB/WA/RA +// 2 = b00000000 = Device-nGnRnE +.equ TT_S1_FAULT, 0x0 +.equ TT_S1_NORMAL_NO_CACHE, 0x00000000000000401 // Index = 0, AF=1 +.equ TT_S1_NORMAL_WBWA, 0x00000000000000405 // Index = 1, AF=1 +.equ TT_S1_DEVICE_nGnRnE, 0x00000000000000409 // Index = 2, AF=1 + +.equ TT_S1_UXN, (1 << 54) +.equ TT_S1_PXN, (1 << 53) +.equ TT_S1_nG, (1 << 11) +.equ TT_S1_NS, (1 << 5) + +.equ TT_S1_NON_SHARED, (0 << 8) // Non-shareable +.equ TT_S1_INNER_SHARED, (3 << 8) // Inner-shareable +.equ TT_S1_OUTER_SHARED, (2 << 8) // Outer-shareable + +.equ TT_S1_PRIV_RW, (0x0) +.equ TT_S1_PRIV_RO, (0x2 << 6) +.equ TT_S1_USER_RW, (0x1 << 6) +.equ TT_S1_USER_RO, (0x3 << 6) + +// ------------------------------------------------------------ + + .global start64 + .type start64, @function +start64: + + // Clear registers + // --------------- + // This is primarily for RTL simulators, to avoid + // possibility of X propergation + MOV x0, #0 + MOV x1, #0 + MOV x2, #0 + MOV x3, #0 + MOV x4, #0 + MOV x5, #0 + MOV x6, #0 + MOV x7, #0 + MOV x8, #0 + MOV x9, #0 + MOV x10, #0 + MOV x11, #0 + MOV x12, #0 + MOV x13, #0 + MOV x14, #0 + MOV x15, #0 + MOV x16, #0 + MOV x17, #0 + MOV x18, #0 + MOV x19, #0 + MOV x20, #0 + MOV x21, #0 + MOV x22, #0 + MOV x23, #0 + MOV x24, #0 + MOV x25, #0 + MOV x26, #0 + MOV x27, #0 + MOV x28, #0 + MOV x29, #0 + MOV x30, #0 + + // Which core am I + // ---------------- + MRS x0, MPIDR_EL1 + AND x0, x0, #0xFF // Mask off to leave Aff0 + CBZ x0, boot // If core 0, run the primary init code +sleep: + WFI + B sleep +boot: + + + // Disable trapping of CPTR_EL3 accesses or use of Adv.SIMD/FPU + // ------------------------------------------------------------- + MOV x0, #0 // Clear all trap bits + MSR CPTR_EL3, x0 + + + // Install vector table + // --------------------- + LDR x0, vector_table_address + MSR VBAR_EL3, x0 + + + // Configure SCR_EL3 + // ------------------ + MOV w1, #0 // Initial value of register is unknown + ORR w1, w1, #(1 << 11) // Set ST bit (Secure EL1 can access CNTPS_TVAL_EL1, CNTPS_CTL_EL1 & CNTPS_CVAL_EL1) + ORR w1, w1, #(1 << 10) // Set RW bit (EL1 is AArch64, as this is the Secure world) + ORR w1, w1, #(1 << 3) // Set EA bit (SError routed to EL3) + ORR w1, w1, #(1 << 2) // Set FIQ bit (FIQs routed to EL3) + ORR w1, w1, #(1 << 1) // Set IRQ bit (IRQs routed to EL3) + MSR SCR_EL3, x1 + + + // + // Cortex-A series specified configuration + // + .ifdef CORTEXA + // Configure ACTLR_EL1 + // -------------------- + // These bits are IMP DEF, so need to different for different + // processors + //MRS x1, ACTLR_EL1 + //ORR x1, x1, #1 // Enable EL1 access to ACTLR_EL1 + //ORR x1, x1, #(1 << 1) // Enable EL1 access to CPUECTLR_EL1 + //ORR x1, x1, #(1 << 4) // Enable EL1 access to L2CTLR_EL1 + //ORR x1, x1, #(1 << 5) // Enable EL1 access to L2ECTLR_EL1 + //ORR x1, x1, #(1 << 6) // Enable EL1 access to L2ACTLR_EL1 + //MSR ACTLR_EL1, x1 + + // Configure CPUECTLR_EL1 + // ----------------------- + // These bits are IMP DEF, so need to different for different + // processors + // SMPEN - bit 6 - Enables the processor to receive cache + // and TLB maintenance operations + // + // NOTE: For Cortex-A57/53 CPUEN should be set beforebefore + // enabling the caches and MMU, or performing any cache + // and TLB maintenance operations. + //MRS x0, S3_1_c15_c2_1 // Read EL1 CPU Extended Control Register + //ORR x0, x0, #(1 << 6) // Set the SMPEN bit + //MSR S3_1_c15_c2_1, x0 // Write EL1 CPU Extended Control Register + //ISB + .endif + + + // Ensure changes to system register are visible before MMU enabled + ISB + + + // Enable Interrupts + // ------------------ + MSR DAIFClr, 0x3 + + + // Branch to scatter loading and C library init code + .global __main + B __main + +//================================================================== +// Manually created literals pool +//================================================================== + .align 3 + +lit_stackheap_limit: + .global Image$$ARM_LIB_STACKHEAP$$ZI$$Limit // Linker symbol from scatter file + .quad (Image$$ARM_LIB_STACKHEAP$$ZI$$Limit) + +vector_table_address: + .global el3_vectors + .quad el3_vectors + +// ------------------------------------------------------------ +// End of file +// ------------------------------------------------------------ + diff --git a/ports/cortex_a5x/ac6/example_build/tx/.cproject b/ports/cortex_a5x/ac6/example_build/tx/.cproject new file mode 100644 index 00000000..11f9c6c9 --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/tx/.cproject @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/example_build/tx/.project b/ports/cortex_a5x/ac6/example_build/tx/.project new file mode 100644 index 00000000..863ca5cb --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_generic + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml b/ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..118220fc --- /dev/null +++ b/ports/cortex_a5x/ac6/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_a5x/ac6/inc/tx_port.h b/ports/cortex_a5x/ac6/inc/tx_port.h new file mode 100644 index 00000000..33a029ff --- /dev/null +++ b/ports/cortex_a5x/ac6/inc/tx_port.h @@ -0,0 +1,367 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A5x/ARM */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef int LONG; +typedef unsigned int ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Override the alignment type to use 64-bit alignment and storage for pointers. */ + +#define ALIGN_TYPE_DEFINED +typedef unsigned long long ALIGN_TYPE; + + +/* Override the free block marker for byte pools to be a 64-bit constant. */ + +#define TX_BYTE_BLOCK_FREE ((ALIGN_TYPE) 0xFFFFEEEEFFFFEEEE) + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 4096 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#define TX_INT_ENABLE 0x00 /* Enable IRQ & FIQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_fp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) b = (UINT) __builtin_ctz((unsigned int) m); + +#endif + + +/* Define the internal timer extension to also hold the thread pointer such that _tx_thread_timeout + can figure out what thread timeout to process. */ + +#define TX_TIMER_INTERNAL_EXTENSION VOID *tx_timer_internal_thread_timeout_ptr; + + +/* Define the thread timeout setup logic in _tx_thread_create. */ + +#define TX_THREAD_CREATE_TIMEOUT_SETUP(t) (t) -> tx_thread_timer.tx_timer_internal_timeout_function = &(_tx_thread_timeout); \ + (t) -> tx_thread_timer.tx_timer_internal_timeout_param = 0; \ + (t) -> tx_thread_timer.tx_timer_internal_thread_timeout_ptr = (VOID *) (t); + + +/* Define the thread timeout pointer setup in _tx_thread_timeout. */ + +#define TX_THREAD_TIMEOUT_POINTER_SETUP(t) (t) = (TX_THREAD *) _tx_timer_expired_timer_ptr -> tx_timer_internal_thread_timeout_ptr; + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef TX_DISABLE_INLINE + +/* Define macros, with in-line assembly for performance. */ + +__attribute__( ( always_inline ) ) static inline unsigned int __disable_interrupts(void) +{ + +unsigned long long daif_value; + + __asm__ volatile (" MRS %0, DAIF ": "=r" (daif_value) ); + __asm__ volatile (" MSR DAIFSet, 0x3" : : : "memory" ); + return((unsigned int) daif_value); +} + +__attribute__( ( always_inline ) ) static inline void __restore_interrupts(unsigned int daif_value) +{ + +unsigned long long temp; + + temp = (unsigned long long) daif_value; + __asm__ volatile (" MSR DAIF,%0": : "r" (temp): "memory" ); +} + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#define TX_DISABLE interrupt_save = __disable_interrupts(); +#define TX_RESTORE __restore_interrupts(interrupt_save); + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define FP extension for the Cortex-A5x. Each is assumed to be called in the context of the executing + thread. */ + +#ifndef TX_SOURCE_CODE +#define tx_thread_fp_enable _tx_thread_fp_enable +#define tx_thread_fp_disable _tx_thread_fp_disable +#endif + +VOID tx_thread_fp_enable(VOID); +VOID tx_thread_fp_disable(VOID); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A5x/ARM Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + diff --git a/ports/cortex_a5x/ac6/readme_threadx.txt b/ports/cortex_a5x/ac6/readme_threadx.txt new file mode 100644 index 00000000..6907bd0f --- /dev/null +++ b/ports/cortex_a5x/ac6/readme_threadx.txt @@ -0,0 +1,255 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A5x + + Using the ARM Compiler 6 & DS + +1. Open the Azure RTOS Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace, which is located inside your ThreadX installation +directory. + +Note: the workspace and projects were made using DS-5, so DS will prompt you +to migrate the projects. This is expected, so please do so. + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply select the Eclipse project file +"tx" and then select the build button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the DS debugger on the +VE-AEMv8x1 Bare Metal simulator. + +Building the demonstration is easy; simply open the workspace file, select the +sample_threadx project, and select the build button. Next, right-click on the +project and select "Debug As -> Debug Configurations". The debugger is setup +for VE_AEMv8x1 Bare Metal Debug, so selecting "Debug" will launch the simulator, +load the sample_threadx.axf ELF file and run to main. You are now ready to +execute the ThreadX demonstration. + + +4. System Initialization + +The entry point in ThreadX for the Cortex-A5x using ARM tools is at label +start64. This is defined within the ARM compiler's startup code. In addition, +this is where all static and global pre-set C variable initialization processing +takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for determining the +first available RAM address for use by the application, which is supplied as the +sole input parameter to your application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The 64-bit ARM compiler assumes that registers x0-x18 are scratch registers +for each function. All other registers used by a C function must be preserved +by the function. ThreadX takes advantage of this in situations where a context +switch happens as a result of making a ThreadX service call (which is itself a +C function). In such cases, the saved context of a thread is only the +non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + +FP not enabled and TX_THREAD.tx_thread_fp_enable == 0: + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x000 SPSR DAIF + 0x008 ELR 0 + 0x010 x28 x27 + 0x018 reserved x28 + 0x020 x26 x25 + 0x028 x27 x26 + 0x030 x24 x23 + 0x038 x25 x24 + 0x040 x22 x21 + 0x048 x23 x22 + 0x050 x20 x19 + 0x058 x21 x20 + 0x060 x18 x29 + 0x068 x19 x30 + 0x070 x16 + 0x078 x17 + 0x080 x14 + 0x088 x15 + 0x090 x12 + 0x098 x13 + 0x0A0 x10 + 0x0A8 x11 + 0x0B0 x8 + 0x0B8 x9 + 0x0C0 x6 + 0x0C8 x7 + 0x0D0 x4 + 0x0D8 x5 + 0x0E0 x2 + 0x0E8 x3 + 0x0F0 x0 + 0x0F8 x1 + 0x100 x29 + 0x108 x30 + + +FP enabled and TX_THREAD.tx_thread_fp_enable == 1: + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x000 SPSR DAIF + 0x008 ELR 0 + 0x010 FPSR FPSR + 0x018 FPCR FPCR + 0x020 q30 q14 + 0x030 q31 q15 + 0x040 q28 q12 + 0x050 q29 q13 + 0x060 q26 q10 + 0x070 q27 q11 + 0x080 q24 q8 + 0x090 q25 q9 + 0x0A0 q22 x27 + 0x0A8 x28 + 0x0B0 q23 x25 + 0x0B8 x26 + 0x0C0 q20 x23 + 0x0C8 x24 + 0x0D0 q21 x21 + 0x0D8 x22 + 0x0E0 q18 x19 + 0x0E8 x20 + 0x0F0 q19 x29 + 0x0F8 x30 + 0x100 q16 + 0x110 q17 + 0x120 q14 + 0x130 q15 + 0x140 q12 + 0x150 q13 + 0x160 q10 + 0x170 q11 + 0x180 q8 + 0x190 q9 + 0x1A0 q6 + 0x1B0 q7 + 0x1C0 q4 + 0x1D0 q5 + 0x1E0 q2 + 0x1F0 q3 + 0x200 q0 + 0x210 q1 + 0x220 x28 + 0x228 reserved + 0x230 x26 + 0x238 x27 + 0x240 x24 + 0x248 x25 + 0x250 x22 + 0x258 x23 + 0x260 x20 + 0x268 x21 + 0x270 x18 + 0x278 x19 + 0x280 x16 + 0x288 x17 + 0x290 x14 + 0x298 x15 + 0x2A0 x12 + 0x2A8 x13 + 0x2B0 x10 + 0x2B8 x11 + 0x2C0 x8 + 0x2C8 x9 + 0x2D0 x6 + 0x2D8 x7 + 0x2E0 x4 + 0x2E8 x5 + 0x2F0 x2 + 0x2F8 x3 + 0x300 x0 + 0x308 x1 + 0x310 x29 + 0x318 x30 + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the project settings to the desired compiler optimization level. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A5x +targets. Interrupts handlers for the 64-bit mode of the Cortex-A5x have the following +format: + + .global irq_handler +irq_handler: + + STP x29, x30, [sp, #-16]! + BL _tx_thread_context_save + + /* Your ISR call goes here! */ + BL application_isr_handler + + B _tx_thread_context_restore + +By default, ThreadX assumes EL3 level of execution. Running and taking exceptions in EL1 +and EL2 can be done by simply building the ThreadX library with either EL1 or EL2 defined. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, thread sleeps, +timeouts, and application timers. Without such a timer interrupt source, these services +are not functional. However, all other ThreadX services are operational without a +periodic timer source. + + +9. ARM FP Support + +By default, FP support is disabled for each thread. If saving the context of the FP registers +is needed, the following API call must be made from the context of the application thread - before +the FP usage: + +void tx_thread_fp_enable(void); + +After this API is called in the application, FP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the FP registers +to be saved/restored. + +To disable FP register context saving, simply call the following API: + +void tx_thread_fp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A5x using ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a5x/ac6/src/tx_initialize_low_level.S b/ports/cortex_a5x/ac6/src/tx_initialize_low_level.S new file mode 100644 index 00000000..699a819a --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_initialize_low_level.S @@ -0,0 +1,112 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_initialize_low_level(VOID) +{ */ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, @function +_tx_initialize_low_level: + + MSR DAIFSet, 0x3 // Lockout interrupts + + + /* Save the system stack pointer. */ + /* _tx_thread_system_stack_ptr = (VOID_PTR) (sp); */ + + LDR x0, =_tx_thread_system_stack_ptr // Pickup address of system stack ptr + MOV x1, sp // Pickup SP + BIC x1, x1, #0xF // Get 16-bit alignment + STR x1, [x0] // Store system stack + + /* Save the first available memory address. */ + /* _tx_initialize_unused_memory = (VOID_PTR) Image$$ZI$$Limit; */ + + LDR x0, =_tx_initialize_unused_memory // Pickup address of unused memory ptr + LDR x1, =zi_limit // Pickup unused memory address + LDR x1, [x1] // + STR x1, [x0] // Store unused memory address + + /* Done, return to caller. */ + + RET // Return to caller +/* } */ + + +zi_limit: + .quad (Image$$ARM_LIB_STACKHEAP$$ZI$$Limit) + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_context_restore.S b/ports/cortex_a5x/ac6/src/tx_thread_context_restore.S new file mode 100644 index 00000000..b8de07ac --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_context_restore.S @@ -0,0 +1,302 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + +/* .set ENABLE_ARM_FP,1 */ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling routine */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_restore(VOID) +{ */ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, @function +_tx_thread_context_restore: + + /* Lockout interrupts. */ + + MSR DAIFSet, 0x3 // Lockout interrupts + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR exit function to indicate an ISR is complete. */ + + BL _tx_execution_isr_exit // Call the ISR exit function +.endif + + /* Determine if interrupts are nested. */ + /* if (--_tx_thread_system_state) + { */ + + LDR x3, =_tx_thread_system_state // Pickup address of system state var + LDR w2, [x3, #0] // Pickup system state + SUB w2, w2, #1 // Decrement the counter + STR w2, [x3, #0] // Store the counter + CMP w2, #0 // Was this the first interrupt? + BEQ __tx_thread_not_nested_restore // If so, not a nested restore + + /* Interrupts are nested. */ + + /* Just recover the saved registers and return to the point of + interrupt. */ + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL +.ifdef EL1 + MSR SPSR_EL1, x4 // Setup SPSR for return + MSR ELR_EL1, x5 // Setup point of interrupt +.else +.ifdef EL2 + MSR SPSR_EL2, x4 // Setup SPSR for return + MSR ELR_EL2, x5 // Setup point of interrupt +.else + MSR SPSR_EL3, x4 // Setup SPSR for return + MSR ELR_EL3, x5 // Setup point of interrupt +.endif +.endif + LDP x18, x19, [sp], #16 // Recover x18, x19 + LDP x16, x17, [sp], #16 // Recover x16, x17 + LDP x14, x15, [sp], #16 // Recover x14, x15 + LDP x12, x13, [sp], #16 // Recover x12, x13 + LDP x10, x11, [sp], #16 // Recover x10, x11 + LDP x8, x9, [sp], #16 // Recover x8, x9 + LDP x6, x7, [sp], #16 // Recover x6, x7 + LDP x4, x5, [sp], #16 // Recover x4, x5 + LDP x2, x3, [sp], #16 // Recover x2, x3 + LDP x0, x1, [sp], #16 // Recover x0, x1 + LDP x29, x30, [sp], #16 // Recover x29, x30 + ERET // Return to point of interrupt + + /* } */ +__tx_thread_not_nested_restore: + + /* Determine if a thread was interrupted and no preemption is required. */ + /* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) + || (_tx_thread_preempt_disable)) + { */ + + LDR x1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR x0, [x1, #0] // Pickup actual current thread pointer + CMP x0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_restore // Yes, idle system was interrupted + + LDR x3, =_tx_thread_preempt_disable // Pickup preempt disable address + LDR w2, [x3, #0] // Pickup actual preempt disable flag + CMP w2, #0 // Is it set? + BNE __tx_thread_no_preempt_restore // Yes, don't preempt this thread + LDR x3, =_tx_thread_execute_ptr // Pickup address of execute thread ptr + LDR x2, [x3, #0] // Pickup actual execute thread pointer + CMP x0, x2 // Is the same thread highest priority? + BNE __tx_thread_preempt_restore // No, preemption needs to happen + + +__tx_thread_no_preempt_restore: + + /* Restore interrupted thread or ISR. */ + + /* Pickup the saved stack pointer. */ + /* sp = _tx_thread_current_ptr -> tx_thread_stack_ptr; */ + + LDR x4, [x0, #8] // Switch to thread stack pointer + MOV sp, x4 // + + /* Recover the saved context and return to the point of interrupt. */ + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL1 +.ifdef EL1 + MSR SPSR_EL1, x4 // Setup SPSR for return + MSR ELR_EL1, x5 // Setup point of interrupt +.else +.ifdef EL2 + MSR SPSR_EL2, x4 // Setup SPSR for return + MSR ELR_EL2, x5 // Setup point of interrupt +.else + MSR SPSR_EL3, x4 // Setup SPSR for return + MSR ELR_EL3, x5 // Setup point of interrupt +.endif +.endif + LDP x18, x19, [sp], #16 // Recover x18, x19 + LDP x16, x17, [sp], #16 // Recover x16, x17 + LDP x14, x15, [sp], #16 // Recover x14, x15 + LDP x12, x13, [sp], #16 // Recover x12, x13 + LDP x10, x11, [sp], #16 // Recover x10, x11 + LDP x8, x9, [sp], #16 // Recover x8, x9 + LDP x6, x7, [sp], #16 // Recover x6, x7 + LDP x4, x5, [sp], #16 // Recover x4, x5 + LDP x2, x3, [sp], #16 // Recover x2, x3 + LDP x0, x1, [sp], #16 // Recover x0, x1 + LDP x29, x30, [sp], #16 // Recover x29, x30 + ERET // Return to point of interrupt + + /* } + else + { */ +__tx_thread_preempt_restore: + + LDR x4, [x0, #8] // Switch to thread stack pointer + MOV sp, x4 // + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL1 + STP x20, x21, [sp, #-16]! // Save x20, x21 + STP x22, x23, [sp, #-16]! // Save x22, x23 + STP x24, x25, [sp, #-16]! // Save x24, x25 + STP x26, x27, [sp, #-16]! // Save x26, x27 + STP x28, x29, [sp, #-16]! // Save x28, x29 +.ifdef ENABLE_ARM_FP + LDR w3, [x0, #248] // Pickup FP enable flag + CMP w3, #0 // Is FP enabled? + BEQ _skip_fp_save // No, skip FP save + STP q0, q1, [sp, #-32]! // Save q0, q1 + STP q2, q3, [sp, #-32]! // Save q2, q3 + STP q4, q5, [sp, #-32]! // Save q4, q5 + STP q6, q7, [sp, #-32]! // Save q6, q7 + STP q8, q9, [sp, #-32]! // Save q8, q9 + STP q10, q11, [sp, #-32]! // Save q10, q11 + STP q12, q13, [sp, #-32]! // Save q12, q13 + STP q14, q15, [sp, #-32]! // Save q14, q15 + STP q16, q17, [sp, #-32]! // Save q16, q17 + STP q18, q19, [sp, #-32]! // Save q18, q19 + STP q20, q21, [sp, #-32]! // Save q20, q21 + STP q22, q23, [sp, #-32]! // Save q22, q23 + STP q24, q25, [sp, #-32]! // Save q24, q25 + STP q26, q27, [sp, #-32]! // Save q26, q27 + STP q28, q29, [sp, #-32]! // Save q28, q29 + STP q30, q31, [sp, #-32]! // Save q30, q31 + MRS x2, FPSR // Pickup FPSR + MRS x3, FPCR // Pickup FPCR + STP x2, x3, [sp, #-16]! // Save FPSR, FPCR +_skip_fp_save: +.endif + STP x4, x5, [sp, #-16]! // Save x4 (SPSR_EL3), x5 (ELR_E3) + + MOV x3, sp // Move sp into x3 + STR x3, [x0, #8] // Save stack pointer in thread control + // block + LDR x3, =_tx_thread_system_stack_ptr // Pickup address of system stack + LDR x4, [x3, #0] // Pickup system stack pointer + MOV sp, x4 // Setup system stack pointer + + + /* Save the remaining time-slice and disable it. */ + /* if (_tx_timer_time_slice) + { */ + + LDR x3, =_tx_timer_time_slice // Pickup time-slice variable address + LDR w2, [x3, #0] // Pickup time-slice + CMP w2, #0 // Is it active? + BEQ __tx_thread_dont_save_ts // No, don't save it + + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; */ + + STR w2, [x0, #36] // Save thread's time-slice + MOV w2, #0 // Clear value + STR w2, [x3, #0] // Disable global time-slice flag + + /* } */ +__tx_thread_dont_save_ts: + + + /* Clear the current task pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + MOV x0, #0 // NULL value + STR x0, [x1, #0] // Clear current thread pointer + + /* Return to the scheduler. */ + /* _tx_thread_schedule(); */ + + /* } */ + +__tx_thread_idle_system_restore: + + /* Just return back to the scheduler! */ + + LDR x1, =_tx_thread_schedule // Build address for _tx_thread_schedule +.ifdef EL1 + MSR ELR_EL1, x1 // Setup point of interrupt + MOV x1, #0x5 // Setup EL1 return + MSR spsr_el1, x1 // Move into SPSR +.else +.ifdef EL2 + MSR ELR_EL2, x1 // Setup point of interrupt + MOV x1, #0x9 // Setup EL2 return + MSR spsr_el2, x1 // Move into SPSR +.else + MSR ELR_EL3, x1 // Setup point of interrupt + MOV x1, #0xD // Setup EL3 return + MSR spsr_el3, x1 // Move into SPSR +.endif +.endif + ERET // Return to scheduler +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_context_save.S b/ports/cortex_a5x/ac6/src/tx_thread_context_save.S new file mode 100644 index 00000000..88774af3 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_context_save.S @@ -0,0 +1,228 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_save(VOID) +{ */ + .global _tx_thread_context_save + .type _tx_thread_context_save, @function +_tx_thread_context_save: + + /* Upon entry to this routine, it is assumed that IRQ/FIQ interrupts are locked + out, x29 (frame pointer), x30 (link register) are saved, we are in EL1, + and all other registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) + { */ + + STP x0, x1, [sp, #-16]! // Save x0, x1 + STP x2, x3, [sp, #-16]! // Save x2, x3 + LDR x3, =_tx_thread_system_state // Pickup address of system state var + LDR w2, [x3, #0] // Pickup system state + CMP w2, #0 // Is this the first interrupt? + BEQ __tx_thread_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD w2, w2, #1 // Increment the nested interrupt counter + STR w2, [x3, #0] // Store it back in the variable + + /* Save the rest of the scratch registers on the stack and return to the + calling ISR. */ + + STP x4, x5, [sp, #-16]! // Save x4, x5 + STP x6, x7, [sp, #-16]! // Save x6, x7 + STP x8, x9, [sp, #-16]! // Save x8, x9 + STP x10, x11, [sp, #-16]! // Save x10, x11 + STP x12, x13, [sp, #-16]! // Save x12, x13 + STP x14, x15, [sp, #-16]! // Save x14, x15 + STP x16, x17, [sp, #-16]! // Save x16, x17 + STP x18, x19, [sp, #-16]! // Save x18, x19 +.ifdef EL1 + MRS x0, SPSR_EL1 // Pickup SPSR + MRS x1, ELR_EL1 // Pickup ELR (point of interrupt) +.else +.ifdef EL2 + MRS x0, SPSR_EL2 // Pickup SPSR + MRS x1, ELR_EL2 // Pickup ELR (point of interrupt) +.else + MRS x0, SPSR_EL3 // Pickup SPSR + MRS x1, ELR_EL3 // Pickup ELR (point of interrupt) +.endif +.endif + STP x0, x1, [sp, #-16]! // Save SPSR, ELR + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + STP x29, x30, [sp, #-16]! // Save x29, x30 + BL _tx_execution_isr_enter // Call the ISR enter function + LDP x29, x30, [sp], #16 // Recover x29, x30 +.endif + + /* Return to the ISR. */ + + RET // Return to ISR + +__tx_thread_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) + { */ + + ADD w2, w2, #1 // Increment the interrupt counter + STR w2, [x3, #0] // Store it back in the variable + LDR x1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR x0, [x1, #0] // Pickup current thread pointer + CMP x0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Save minimal context of interrupted thread. */ + + STP x4, x5, [sp, #-16]! // Save x4, x5 + STP x6, x7, [sp, #-16]! // Save x6, x7 + STP x8, x9, [sp, #-16]! // Save x8, x9 + STP x10, x11, [sp, #-16]! // Save x10, x11 + STP x12, x13, [sp, #-16]! // Save x12, x13 + STP x14, x15, [sp, #-16]! // Save x14, x15 + STP x16, x17, [sp, #-16]! // Save x16, x17 + STP x18, x19, [sp, #-16]! // Save x18, x19 +.ifdef EL1 + MRS x4, SPSR_EL1 // Pickup SPSR + MRS x5, ELR_EL1 // Pickup ELR (point of interrupt) +.else +.ifdef EL2 + MRS x4, SPSR_EL2 // Pickup SPSR + MRS x5, ELR_EL2 // Pickup ELR (point of interrupt) +.else + MRS x4, SPSR_EL3 // Pickup SPSR + MRS x5, ELR_EL3 // Pickup ELR (point of interrupt) +.endif +.endif + STP x4, x5, [sp, #-16]! // Save SPSR, ELR + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + MOV x4, sp // + STR x4, [x0, #8] // Save thread stack pointer + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + LDR x3, =_tx_thread_system_stack_ptr // Pickup address of system stack + LDR x4, [x3, #0] // Pickup system stack pointer + MOV sp, x4 // Setup system stack pointer + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + STP x29, x30, [sp, #-16]! // Save x29, x30 + BL _tx_execution_isr_enter // Call the ISR enter function + LDP x29, x30, [sp], #16 // Recover x29, x30 +.endif + + RET // Return to caller + + /* } + else + { */ + +__tx_thread_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + + /* Not much to do here, just adjust the stack pointer, and return to IRQ + processing. */ + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + STP x29, x30, [sp, #-16]! // Save x29, x30 + BL _tx_execution_isr_enter // Call the ISR enter function + LDP x29, x30, [sp], #16 // Recover x29, x30 +.endif + + ADD sp, sp, #48 // Recover saved registers + RET // Continue IRQ processing + + /* } +} */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c b/ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c new file mode 100644 index 00000000..8a921e86 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_fp_disable.c @@ -0,0 +1,95 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fp_disable Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function disables the FP for the currently executing thread. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_fp_disable(VOID) +{ + +TX_THREAD *thread_ptr; +ULONG system_state; + + + /* Pickup the current thread pointer. */ + TX_THREAD_GET_CURRENT(thread_ptr); + + /* Get the system state. */ + system_state = TX_THREAD_GET_SYSTEM_STATE(); + + /* Make sure it is not NULL. */ + if (thread_ptr != TX_NULL) + { + + /* Thread is running... make sure the call is from the thread context. */ + if (system_state == 0) + { + + /* Yes, now set the FP enable flag to false in the TX_THREAD structure. */ + thread_ptr -> tx_thread_fp_enable = TX_FALSE; + } + } +} + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c b/ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c new file mode 100644 index 00000000..818b3e8a --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_fp_enable.c @@ -0,0 +1,95 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fp_enable Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function enabled the FP for the currently executing thread. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_fp_enable(VOID) +{ + +TX_THREAD *thread_ptr; +ULONG system_state; + + + /* Pickup the current thread pointer. */ + TX_THREAD_GET_CURRENT(thread_ptr); + + /* Get the system state. */ + system_state = TX_THREAD_GET_SYSTEM_STATE(); + + /* Make sure it is not NULL. */ + if (thread_ptr != TX_NULL) + { + + /* Thread is running... make sure the call is from the thread context. */ + if (system_state == 0) + { + + /* Yes, now setup the FP enable flag in the TX_THREAD structure. */ + thread_ptr -> tx_thread_fp_enable = TX_TRUE; + } + } +} + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..1096b0b8 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_control.S @@ -0,0 +1,89 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/*#define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_control(UINT new_posture) +{ */ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, @function +_tx_thread_interrupt_control: + + /* Pickup current interrupt lockout posture. */ + + MRS x1, DAIF // Pickup current interrupt posture + + /* Apply the new interrupt posture. */ + + MSR DAIF, x0 // Set new interrupt posture + MOV x0, x1 // Setup return value + RET // Return to caller +/* } */ + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..fb865d66 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_disable.S @@ -0,0 +1,87 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_disable Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for disabling interrupts */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_disable(void) +{ */ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable, @function +_tx_thread_interrupt_disable: + + /* Pickup current interrupt lockout posture. */ + + MRS x0, DAIF // Pickup current interrupt lockout posture + + /* Mask interrupts. */ + + MSR DAIFSet, 0x3 // Lockout interrupts + RET // Return to caller +/* } */ + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..336f54f8 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_interrupt_restore.S @@ -0,0 +1,85 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_restore Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for restoring interrupts to the state */ +/* returned by a previous _tx_thread_interrupt_disable call. */ +/* */ +/* INPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_restore(UINT old_posture) +{ */ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore, @function +_tx_thread_interrupt_restore: + + /* Restore the old interrupt posture. */ + + MSR DAIF, x0 // Setup the old posture + RET // Return to caller + +/* } */ + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_schedule.S b/ports/cortex_a5x/ac6/src/tx_thread_schedule.S new file mode 100644 index 00000000..7b4e7ff4 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_schedule.S @@ -0,0 +1,240 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + +/* .set ENABLE_ARM_FP,1 */ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* _tx_thread_system_return Return to system from thread */ +/* _tx_thread_context_restore Restore thread's context */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_schedule(VOID) +{ */ + .global _tx_thread_schedule + .type _tx_thread_schedule, @function +_tx_thread_schedule: + + /* Enable interrupts. */ + + MSR DAIFClr, 0x3 // Enable interrupts + + /* Wait for a thread to execute. */ + /* do + { */ + + LDR x1, =_tx_thread_execute_ptr // Address of thread execute ptr + +.ifdef TX_ENABLE_WFI +__tx_thread_schedule_loop: + LDR x0, [x1, #0] // Pickup next thread to execute + CMP x0, #0 // Is it NULL? + BNE _tx_thread_schedule_thread // + WFI // + B __tx_thread_schedule_loop // Keep looking for a thread +_tx_thread_schedule_thread: +.else +__tx_thread_schedule_loop: + LDR x0, [x1, #0] // Pickup next thread to execute + CMP x0, #0 // Is it NULL? + BEQ __tx_thread_schedule_loop // If so, keep looking for a thread +.endif + + /* } + while(_tx_thread_execute_ptr == TX_NULL); */ + + /* Yes! We have a thread to execute. Lockout interrupts and + transfer control to it. */ + + MSR DAIFSet, 0x3 // Lockout interrupts + + /* Setup the current thread pointer. */ + /* _tx_thread_current_ptr = _tx_thread_execute_ptr; */ + + LDR x1, =_tx_thread_current_ptr // Pickup address of current thread + STR x0, [x1, #0] // Setup current thread pointer + + /* Increment the run count for this thread. */ + /* _tx_thread_current_ptr -> tx_thread_run_count++; */ + + LDR w2, [x0, #4] // Pickup run counter + LDR w3, [x0, #36] // Pickup time-slice for this thread + ADD w2, w2, #1 // Increment thread run-counter + STR w2, [x0, #4] // Store the new run counter + + /* Setup time-slice, if present. */ + /* _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; */ + + LDR x2, =_tx_timer_time_slice // Pickup address of time slice + // variable + LDR x4, [x0, #8] // Switch stack pointers + MOV sp, x4 // + STR w3, [x2, #0] // Setup time-slice + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread entry function to indicate the thread is executing. */ + + MOV x19, x0 // Save x0 + BL _tx_execution_thread_enter // Call the thread execution enter function + MOV x0, x19 // Restore x0 +.endif + + /* Switch to the thread's stack. */ + /* sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; */ + + /* Determine if an interrupt frame or a synchronous task suspension frame + is present. */ + + LDP x4, x5, [sp], #16 // Pickup saved SPSR/DAIF and ELR_EL1 + CMP x5, #0 // Check for synchronous context switch (ELR_EL1 = NULL) + BEQ _tx_solicited_return +.ifdef EL1 + MSR SPSR_EL1, x4 // Setup SPSR for return + MSR ELR_EL1, x5 // Setup point of interrupt +.else +.ifdef EL2 + MSR SPSR_EL2, x4 // Setup SPSR for return + MSR ELR_EL2, x5 // Setup point of interrupt +.else + MSR SPSR_EL3, x4 // Setup SPSR for return + MSR ELR_EL3, x5 // Setup point of interrupt +.endif +.endif +.ifdef ENABLE_ARM_FP + LDR w1, [x0, #248] // Pickup FP enable flag + CMP w1, #0 // Is FP enabled? + BEQ _skip_interrupt_fp_restore // No, skip FP restore + LDP x0, x1, [sp], #16 // Pickup FPSR, FPCR + MSR FPSR, x0 // Recover FPSR + MSR FPCR, x1 // Recover FPCR + LDP q30, q31, [sp], #32 // Recover q30, q31 + LDP q28, q29, [sp], #32 // Recover q28, q29 + LDP q26, q27, [sp], #32 // Recover q26, q27 + LDP q24, q25, [sp], #32 // Recover q24, q25 + LDP q22, q23, [sp], #32 // Recover q22, q23 + LDP q20, q21, [sp], #32 // Recover q20, q21 + LDP q18, q19, [sp], #32 // Recover q18, q19 + LDP q16, q17, [sp], #32 // Recover q16, q17 + LDP q14, q15, [sp], #32 // Recover q14, q15 + LDP q12, q13, [sp], #32 // Recover q12, q13 + LDP q10, q11, [sp], #32 // Recover q10, q11 + LDP q8, q9, [sp], #32 // Recover q8, q9 + LDP q6, q7, [sp], #32 // Recover q6, q7 + LDP q4, q5, [sp], #32 // Recover q4, q5 + LDP q2, q3, [sp], #32 // Recover q2, q3 + LDP q0, q1, [sp], #32 // Recover q0, q1 +_skip_interrupt_fp_restore: +.endif + LDP x28, x29, [sp], #16 // Recover x28 + LDP x26, x27, [sp], #16 // Recover x26, x27 + LDP x24, x25, [sp], #16 // Recover x24, x25 + LDP x22, x23, [sp], #16 // Recover x22, x23 + LDP x20, x21, [sp], #16 // Recover x20, x21 + LDP x18, x19, [sp], #16 // Recover x18, x19 + LDP x16, x17, [sp], #16 // Recover x16, x17 + LDP x14, x15, [sp], #16 // Recover x14, x15 + LDP x12, x13, [sp], #16 // Recover x12, x13 + LDP x10, x11, [sp], #16 // Recover x10, x11 + LDP x8, x9, [sp], #16 // Recover x8, x9 + LDP x6, x7, [sp], #16 // Recover x6, x7 + LDP x4, x5, [sp], #16 // Recover x4, x5 + LDP x2, x3, [sp], #16 // Recover x2, x3 + LDP x0, x1, [sp], #16 // Recover x0, x1 + LDP x29, x30, [sp], #16 // Recover x29, x30 + ERET // Return to point of interrupt + +_tx_solicited_return: + +.ifdef ENABLE_ARM_FP + LDR w1, [x0, #248] // Pickup FP enable flag + CMP w1, #0 // Is FP enabled? + BEQ _skip_solicited_fp_restore // No, skip FP restore + LDP x0, x1, [sp], #16 // Pickup FPSR, FPCR + MSR FPSR, x0 // Recover FPSR + MSR FPCR, x1 // Recover FPCR + LDP q14, q15, [sp], #32 // Recover q14, q15 + LDP q12, q13, [sp], #32 // Recover q12, q13 + LDP q10, q11, [sp], #32 // Recover q10, q11 + LDP q8, q9, [sp], #32 // Recover q8, q9 +_skip_solicited_fp_restore: +.endif + LDP x27, x28, [sp], #16 // Recover x27, x28 + LDP x25, x26, [sp], #16 // Recover x25, x26 + LDP x23, x24, [sp], #16 // Recover x23, x24 + LDP x21, x22, [sp], #16 // Recover x21, x22 + LDP x19, x20, [sp], #16 // Recover x19, x20 + LDP x29, x30, [sp], #16 // Recover x29, x30 + MSR DAIF, x4 // Recover DAIF + RET // Return to caller +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_stack_build.S b/ports/cortex_a5x/ac6/src/tx_thread_stack_build.S new file mode 100644 index 00000000..cd8609f2 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_stack_build.S @@ -0,0 +1,170 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +*/ + + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +{ */ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, @function +_tx_thread_stack_build: + + + /* Build a fake interrupt frame. The form of the fake interrupt stack + on the Cortex-A5x should look like the following after it is built: + + Stack Top: SSPR Initial SSPR + ELR Point of interrupt + x28 Initial value for x28 + not used Not used + x26 Initial value for x26 + x27 Initial value for x27 + x24 Initial value for x24 + x25 Initial value for x25 + x22 Initial value for x22 + x23 Initial value for x23 + x20 Initial value for x20 + x21 Initial value for x21 + x18 Initial value for x18 + x19 Initial value for x19 + x16 Initial value for x16 + x17 Initial value for x17 + x14 Initial value for x14 + x15 Initial value for x15 + x12 Initial value for x12 + x13 Initial value for x13 + x10 Initial value for x10 + x11 Initial value for x11 + x8 Initial value for x8 + x9 Initial value for x9 + x6 Initial value for x6 + x7 Initial value for x7 + x4 Initial value for x4 + x5 Initial value for x5 + x2 Initial value for x2 + x3 Initial value for x3 + x0 Initial value for x0 + x1 Initial value for x1 + x29 Initial value for x29 (frame pointer) + x30 Initial value for x30 (link register) + 0 For stack backtracing + + Stack Bottom: (higher memory address) */ + + LDR x4, [x0, #24] // Pickup end of stack area + BIC x4, x4, #0xF // Ensure 16-byte alignment + + /* Actually build the stack frame. */ + + MOV x2, #0 // Build clear value + MOV x3, #0 // + + STP x2, x3, [x4, #-16]! // Set backtrace to 0 + STP x2, x3, [x4, #-16]! // Set initial x29, x30 + STP x2, x3, [x4, #-16]! // Set initial x0, x1 + STP x2, x3, [x4, #-16]! // Set initial x2, x3 + STP x2, x3, [x4, #-16]! // Set initial x4, x5 + STP x2, x3, [x4, #-16]! // Set initial x6, x7 + STP x2, x3, [x4, #-16]! // Set initial x8, x9 + STP x2, x3, [x4, #-16]! // Set initial x10, x11 + STP x2, x3, [x4, #-16]! // Set initial x12, x13 + STP x2, x3, [x4, #-16]! // Set initial x14, x15 + STP x2, x3, [x4, #-16]! // Set initial x16, x17 + STP x2, x3, [x4, #-16]! // Set initial x18, x19 + STP x2, x3, [x4, #-16]! // Set initial x20, x21 + STP x2, x3, [x4, #-16]! // Set initial x22, x23 + STP x2, x3, [x4, #-16]! // Set initial x24, x25 + STP x2, x3, [x4, #-16]! // Set initial x26, x27 + STP x2, x3, [x4, #-16]! // Set initial x28 +.ifdef EL1 + MOV x2, #0x5 // Build initial SPSR (EL1) +.else +.ifdef EL2 + MOV x2, #0x9 // Build initial SPSR (EL2) +.else + MOV x2, #0xD // Build initial SPSR (EL3) +.endif +.endif + MOV x3, x1 // Build initial ELR + STP x2, x3, [x4, #-16]! // Set initial SPSR & ELR + + /* Setup stack pointer. */ + /* thread_ptr -> tx_thread_stack_ptr = x2; */ + + STR x4, [x0, #8] // Save stack pointer in thread's + RET // Return to caller + +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_thread_system_return.S b/ports/cortex_a5x/ac6/src/tx_thread_system_return.S new file mode 100644 index 00000000..5106a801 --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_thread_system_return.S @@ -0,0 +1,165 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + +/* .set ENABLE_ARM_FP,1 */ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the ThreadX system. Only a */ +/* minimal context is saved since the compiler assumes temp registers */ +/* are going to get slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling loop */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_system_return(VOID) +{ */ + .global _tx_thread_system_return + .type _tx_thread_system_return, @function +_tx_thread_system_return: +; +; /* Save minimal context on the stack. */ +; + MRS x0, DAIF // Pickup DAIF + MSR DAIFSet, 0x3 // Lockout interrupts + STP x29, x30, [sp, #-16]! // Save x29 (frame pointer), x30 (link register) + STP x19, x20, [sp, #-16]! // Save x19, x20 + STP x21, x22, [sp, #-16]! // Save x21, x22 + STP x23, x24, [sp, #-16]! // Save x23, x24 + STP x25, x26, [sp, #-16]! // Save x25, x26 + STP x27, x28, [sp, #-16]! // Save x27, x28 + LDR x5, =_tx_thread_current_ptr // Pickup address of current ptr + LDR x6, [x5, #0] // Pickup current thread pointer + +.ifdef ENABLE_ARM_FP + LDR w7, [x6, #248] // Pickup FP enable flag + CMP w7, #0 // Is FP enabled? + BEQ _skip_fp_save // No, skip FP save + STP q8, q9, [sp, #-32]! // Save q8, q9 + STP q10, q11, [sp, #-32]! // Save q10, q11 + STP q12, q13, [sp, #-32]! // Save q12, q13 + STP q14, q15, [sp, #-32]! // Save q14, q15 + MRS x2, FPSR // Pickup FPSR + MRS x3, FPCR // Pickup FPCR + STP x2, x3, [sp, #-16]! // Save FPSR, FPCR +_skip_fp_save: +.endif + + MOV x1, #0 // Clear x1 + STP x0, x1, [sp, #-16]! // Save DAIF and clear value for ELR_EK1 + +.ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread exit function to indicate the thread is no longer executing. */ + + MOV x19, x5 // Save x5 + MOV x20, x6 // Save x6 + BL _tx_execution_thread_exit // Call the thread exit function + MOV x5, x19 // Restore x5 + MOV x6, x20 // Restore x6 +.endif + + LDR x2, =_tx_timer_time_slice // Pickup address of time slice + LDR w1, [x2, #0] // Pickup current time slice + + /* Save current stack and switch to system stack. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV x4, sp // + STR x4, [x6, #8] // Save thread stack pointer + LDR x3, =_tx_thread_system_stack_ptr // Pickup address of system stack + LDR x4, [x3, #0] // Pickup system stack pointer + MOV sp, x4 // Setup system stack pointer + + /* Determine if the time-slice is active. */ + /* if (_tx_timer_time_slice) + { */ + + MOV x4, #0 // Build clear value + CMP w1, #0 // Is a time-slice active? + BEQ __tx_thread_dont_save_ts // No, don't save the time-slice + + /* Save the current remaining time-slice. */ + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; */ + + STR w4, [x2, #0] // Clear time-slice + STR w1, [x6, #36] // Store current time-slice + + /* } */ +__tx_thread_dont_save_ts: + + /* Clear the current thread pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + STR x4, [x5, #0] // Clear current thread pointer + + B _tx_thread_schedule // Jump to scheduler! + +/* } */ + + diff --git a/ports/cortex_a5x/ac6/src/tx_timer_interrupt.S b/ports/cortex_a5x/ac6/src/tx_timer_interrupt.S new file mode 100644 index 00000000..1559352e --- /dev/null +++ b/ports/cortex_a5x/ac6/src/tx_timer_interrupt.S @@ -0,0 +1,240 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_timer.h" +#include "tx_thread.h" +*/ + + .text + .align 3 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Cortex-A5x/ARM */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_timer_interrupt(VOID) +{ */ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, @function +_tx_timer_interrupt: + + /* Upon entry to this routine, it is assumed that context save has already + been called, and therefore the compiler scratch registers are available + for use. */ + + /* Increment the system clock. */ + /* _tx_timer_system_clock++; */ + + LDR x1, =_tx_timer_system_clock // Pickup address of system clock + LDR w0, [x1, #0] // Pickup system clock + ADD w0, w0, #1 // Increment system clock + STR w0, [x1, #0] // Store new system clock + + /* Test for time-slice expiration. */ + /* if (_tx_timer_time_slice) + { */ + + LDR x3, =_tx_timer_time_slice // Pickup address of time-slice + LDR w2, [x3, #0] // Pickup time-slice + CMP w2, #0 // Is it non-active? + BEQ __tx_timer_no_time_slice // Yes, skip time-slice processing + + /* Decrement the time_slice. */ + /* _tx_timer_time_slice--; */ + + SUB w2, w2, #1 // Decrement the time-slice + STR w2, [x3, #0] // Store new time-slice value + + /* Check for expiration. */ + /* if (__tx_timer_time_slice == 0) */ + + CMP w2, #0 // Has it expired? + BNE __tx_timer_no_time_slice // No, skip expiration processing + + /* Set the time-slice expired flag. */ + /* _tx_timer_expired_time_slice = TX_TRUE; */ + + LDR x3, =_tx_timer_expired_time_slice // Pickup address of expired flag + MOV w0, #1 // Build expired value + STR w0, [x3, #0] // Set time-slice expiration flag + + /* } */ + +__tx_timer_no_time_slice: + + /* Test for timer expiration. */ + /* if (*_tx_timer_current_ptr) + { */ + + LDR x1, =_tx_timer_current_ptr // Pickup current timer pointer addr + LDR x0, [x1, #0] // Pickup current timer + LDR x2, [x0, #0] // Pickup timer list entry + CMP x2, #0 // Is there anything in the list? + BEQ __tx_timer_no_timer // No, just increment the timer + + /* Set expiration flag. */ + /* _tx_timer_expired = TX_TRUE; */ + + LDR x3, =_tx_timer_expired // Pickup expiration flag address + MOV w2, #1 // Build expired value + STR w2, [x3, #0] // Set expired flag + B __tx_timer_done // Finished timer processing + + /* } + else + { */ +__tx_timer_no_timer: + + /* No timer expired, increment the timer pointer. */ + /* _tx_timer_current_ptr++; */ + + ADD x0, x0, #8 // Move to next timer + + /* Check for wrap-around. */ + /* if (_tx_timer_current_ptr == _tx_timer_list_end) */ + + LDR x3, =_tx_timer_list_end // Pickup addr of timer list end + LDR x2, [x3, #0] // Pickup list end + CMP x0, x2 // Are we at list end? + BNE __tx_timer_skip_wrap // No, skip wrap-around logic + + /* Wrap to beginning of list. */ + /* _tx_timer_current_ptr = _tx_timer_list_start; */ + + LDR x3, =_tx_timer_list_start // Pickup addr of timer list start + LDR x0, [x3, #0] // Set current pointer to list start + +__tx_timer_skip_wrap: + + STR x0, [x1, #0] // Store new current timer pointer + /* } */ + +__tx_timer_done: + + + /* See if anything has expired. */ + /* if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) + { */ + + LDR x3, =_tx_timer_expired_time_slice // Pickup addr of expired flag + LDR w2, [x3, #0] // Pickup time-slice expired flag + CMP w2, #0 // Did a time-slice expire? + BNE __tx_something_expired // If non-zero, time-slice expired + LDR x1, =_tx_timer_expired // Pickup addr of other expired flag + LDR w0, [x1, #0] // Pickup timer expired flag + CMP w0, #0 // Did a timer expire? + BEQ __tx_timer_nothing_expired // No, nothing expired + +__tx_something_expired: + + + STP x29, x30, [sp, #-16]! // Save x29 (frame pointer), x30 (link register) + + /* Did a timer expire? */ + /* if (_tx_timer_expired) + { */ + + LDR x1, =_tx_timer_expired // Pickup addr of expired flag + LDR w0, [x1, #0] // Pickup timer expired flag + CMP w0, #0 // Check for timer expiration + BEQ __tx_timer_dont_activate // If not set, skip timer activation + + /* Process timer expiration. */ + /* _tx_timer_expiration_process(); */ + + BL _tx_timer_expiration_process // Call the timer expiration handling routine + + /* } */ +__tx_timer_dont_activate: + + /* Did time slice expire? */ + /* if (_tx_timer_expired_time_slice) + { */ + + LDR x3, =_tx_timer_expired_time_slice // Pickup addr of time-slice expired + LDR w2, [x3, #0] // Pickup the actual flag + CMP w2, #0 // See if the flag is set + BEQ __tx_timer_not_ts_expiration // No, skip time-slice processing + + /* Time slice interrupted thread. */ + /* _tx_thread_time_slice(); */ + + BL _tx_thread_time_slice // Call time-slice processing + + /* } */ + +__tx_timer_not_ts_expiration: + + LDP x29, x30, [sp], #16 // Recover x29, x30 + /* } */ + +__tx_timer_nothing_expired: + + RET // Return to caller + +/* } */ + + diff --git a/ports/cortex_a7/ac5/example_build/build_threadx.bat b/ports/cortex_a7/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..bca9317b --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a7.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a7/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a7/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..a3429108 --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a7.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a7.no_neon --fpu=softvfp -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a7/ac5/example_build/sample_threadx.c b/ports/cortex_a7/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..f137555a --- /dev/null +++ b/ports/cortex_a7/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,414 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size + +VFPEnable EQU 0x40000000 ; VFP enable value + +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A7 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=Reset_Vector ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + EXPORT Reset_Vector +Reset_Vector + + IF {TARGET_FPU_VFP} = {TRUE} + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #VFPEnable ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 + ENDIF + + B __main +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a7/ac5/inc/tx_port.h b/ports/cortex_a7/ac5/inc/tx_port.h new file mode 100644 index 00000000..9ba22c77 --- /dev/null +++ b/ports/cortex_a7/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A7/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A7/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a7/ac5/readme_threadx.txt b/ports/cortex_a7/ac5/readme_threadx.txt new file mode 100644 index 00000000..4423047b --- /dev/null +++ b/ports/cortex_a7/ac5/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A7 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +Compiler. At this point you may run the build_threadx.bat batch file. This will +build the ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A7 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A7 Specifies Cortex-A7 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A7 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A7 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A7 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A7 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A7 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a7/ac5/src/tx_thread_context_restore.s b/ports/cortex_a7/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..0d03b49c --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_context_save.s b/ports/cortex_a7/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..93f1fc52 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..fc1c0dfc --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..45b0d4cb --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..ce1d8ae2 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..84c344a7 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..717606de --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..70c49171 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..5dcb28e6 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..3af929a5 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..c1083df4 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_schedule.s b/ports/cortex_a7/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..76ea630f --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_stack_build.s b/ports/cortex_a7/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..965582ab --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,165 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A7 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF + +;} + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_system_return.s b/ports/cortex_a7/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..95eed654 --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..6237775e --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a7/ac5/src/tx_timer_interrupt.s b/ports/cortex_a7/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..eb23279f --- /dev/null +++ b/ports/cortex_a7/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a7/gnu/example_build/build_threadx.bat b/ports/cortex_a7/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..856fcc92 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a7/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a7/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..561bab52 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a7 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a7 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a7/gnu/example_build/crt0.S b/ports/cortex_a7/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a7/gnu/example_build/libc.a b/ports/cortex_a7/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_a7/gnu/example_build/libc.a differ diff --git a/ports/cortex_a7/gnu/example_build/libgcc.a b/ports/cortex_a7/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_a7/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_a7/gnu/example_build/reset.S b/ports/cortex_a7/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_a7/gnu/example_build/sample_threadx.c b/ports/cortex_a7/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a7/gnu/example_build/sample_threadx.ld b/ports/cortex_a7/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_a7/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_a7/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..6138b610 --- /dev/null +++ b/ports/cortex_a7/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_a7/gnu/inc/tx_port.h b/ports/cortex_a7/gnu/inc/tx_port.h new file mode 100644 index 00000000..07221bb7 --- /dev/null +++ b/ports/cortex_a7/gnu/inc/tx_port.h @@ -0,0 +1,323 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A7/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A7. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A7/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a7/gnu/readme_threadx.txt b/ports/cortex_a7/gnu/readme_threadx.txt new file mode 100644 index 00000000..f56a131e --- /dev/null +++ b/ports/cortex_a7/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A7 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A7 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a7 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a7 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A7 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A7 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a7/gnu/src/tx_thread_context_restore.S b/ports/cortex_a7/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..1a90baaf --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_context_save.S b/ports/cortex_a7/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..0535151c --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..b7ce5f4e --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..16ff6eb6 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..f4dbedda --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..ac18c99a --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..453a6b43 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..64721b51 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..8bae905a --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..c62e38e1 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..4e2fd962 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_schedule.S b/ports/cortex_a7/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..f0e20b7e --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a7/gnu/src/tx_thread_stack_build.S b/ports/cortex_a7/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..6c89ae45 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A7 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a7/gnu/src/tx_thread_system_return.S b/ports/cortex_a7/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..5c2047b4 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..b01f9190 --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a7/gnu/src/tx_timer_interrupt.S b/ports/cortex_a7/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..bf58c2ee --- /dev/null +++ b/ports/cortex_a7/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A7/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a7/iar/example_build/azure_rtos.eww b/ports/cortex_a7/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a7/iar/example_build/cstartup.s b/ports/cortex_a7/iar/example_build/cstartup.s new file mode 100644 index 00000000..647de2e8 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/cstartup.s @@ -0,0 +1,156 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #0x40000000 ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.c b/ports/cortex_a7/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c2cc9886 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.dep b/ports/cortex_a7/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..1a307303 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.dep @@ -0,0 +1,219 @@ + + + 4 + 3543161750 + + Debug + + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\tx_port.h + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\cstartup.s79 + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\lib\m7Sx_tlv.a + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\List\cstartup.lst + $TOOLKIT_DIR$\inc\ycheck.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\cstartup.s + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\demo.r79 + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $TOOLKIT_DIR$\inc\DLib_Product.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\DEMO.C + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + + + [ROOT_NODE] + + + ILINK + 16 26 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 31 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 26 + + + + + ILINK + 14 31 10 41 3 58 52 21 44 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 10 + + + __cstat + 25 + + + BICOMP + 20 + + + + + ICCARM + 18 57 40 38 30 28 51 55 4 42 13 27 34 12 53 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 31 23 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 3 7 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 19 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 3 7 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 29 + + + BICOMP + 37 + + + + + ICCARM + 47 5 0 24 22 46 17 45 2 39 11 6 8 43 + + + BICOMP + 47 5 0 24 22 46 45 2 39 11 6 8 43 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 36 + + + + + ICCARM + 47 5 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 1 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.ewd b/ports/cortex_a7/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..af953994 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.ewp b/ports/cortex_a7/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..b287d3a6 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.ewt b/ports/cortex_a7/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..7bc99f50 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a7/iar/example_build/sample_threadx.icf b/ports/cortex_a7/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..31789f29 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 329 + 30 + 30 + 30 + + + <ws> + + + + 14 + 26 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000900259600000200000010860000140000000C81000006000000048600000200000017810000020000000E8100000100000011860000140000004681000003000000E880000002000000 + + + 09000D8400000F84000008840000FFFFFFFF54840000328100001C8100000984000053840000 + 0600048400004C000000068400004E0000000E8400005000000030840000520000000B8100001F0000000D81000021000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000066040000000A000065050000 + 000000004F040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a7\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000067040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a7\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 0000000032000000910100004B040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF9101000032000000950100004B0400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000004B040000000A00004F040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000066040000000A000065050000000000004F040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..00e828be --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..7e660a93 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..ddc3572b --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A7" + +"--fpu=VFPv4Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..6bf922a5 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_a7\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a7/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..4dee51e4 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1632 @@ + + + + + + 20 + 1186 + + + 20 + 889 + 237 + 59 + + + + 124 + 27 + 27 + 27 + + + + + Disassembly + _I0 + + + 500 + 20 + + + 1 + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 140 + 150 + 100 + 100 + + + + + + + + TabID-7073-29966 + Debug Log + Debug-Log + + + + TabID-6551-29976 + Build + Build + + + + 1 + + + + + TabID-17822-29969 + Workspace + Workspace + + + sample_threadx + + + + + 0 + + + + + TabID-28570-29973 + Disassembly + Disassembly + + + + 0 + + + + + TabID-3937-30025 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 0 + 0 + 0 + 0 + 214 + 7621 + 7621 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + + + + -2 + -2 + 486 + 198 + -2 + -2 + 200 + 200 + 160643 + 265604 + 160643 + 648074 + + + + + + + + + + + -2 + -2 + 486 + 198 + -2 + -2 + 200 + 200 + 160643 + 265604 + 160643 + 648074 + + + + + + + + + -2 + 196 + 486 + 420 + 196 + -2 + 200 + 200 + 160643 + 265604 + 179920 + 648074 + + + + + + + + + + + -2 + -2 + 198 + 1247 + -2 + -2 + 1249 + 200 + 1003213 + 265604 + 160643 + 265604 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 150 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 2A0000000900259600000200000010860000140000000C81000006000000048600000200000017810000020000000E8100000300000011860000140000004681000003000000E880000002000000 + + + 1500FFFFFFFF83860000588600002AE10000008200001C8200000182000067860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 250057860000180000002CE1000073000000599200002400000023920000000000005F86000064000000008D00001E00000023E100006D00000007860000280000001D92000011000000198200004500000004860000250000009A860000160000004A81000077000000168200004300000000840000780000002BE1000072000000259200001900000044920000220000001A8600003200000025E100006F0000002F820000460000001F9200001F0000008E8600003B00000022E100006C00000006860000270000002D92000021000000698600003800000018820000440000005586000006000000498100007600000023960000890000000E86000017000000A18600003C000000C386000003000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + EE0700004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFFEA0700004C000000EE0700009A0400000100000002000010040000000100000065F9FFFF01020000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000020062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..03ff9930 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 2693685061 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..ddc3572b --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A7" + +"--fpu=VFPv4Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.crun b/ports/cortex_a7/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.dbgdt b/ports/cortex_a7/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a7/iar/example_build/settings/tx.dnx b/ports/cortex_a7/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a7/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a7/iar/example_build/tx.dep b/ports/cortex_a7/iar/example_build/tx.dep new file mode 100644 index 00000000..90ec9672 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.dep @@ -0,0 +1,10516 @@ + + + 4 + 3156940391 + + Debug + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Tx_ti.c + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\txe_thread_info_get.c + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Txe_tt.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Tx_sd.c + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Txe_qc.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + + + [ROOT_NODE] + + + IARCHIVE + 649 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 424 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 573 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 33 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 1131 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 1147 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 618 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 37 35 41 34 42 33 43 39 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 849 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 429 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 552 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 686 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 1058 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 685 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 626 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 851 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 892 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 460 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 586 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 529 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 441 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 1138 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 765 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 880 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 719 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 545 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 567 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 787 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 677 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 525 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 501 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 796 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 537 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 845 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 937 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 871 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 39 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 937 + + + __cstat + 1073 + + + BICOMP + 860 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 596 642 470 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 675 + + + __cstat + 1114 + + + BICOMP + 555 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 + + + BICOMP + 816 596 154 327 962 67 670 433 368 438 642 918 863 473 450 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 771 + + + __cstat + 1085 + + + BICOMP + 738 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 584 + + + __cstat + 976 + + + BICOMP + 983 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 1112 + + + __cstat + 993 + + + BICOMP + 595 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 844 + + + __cstat + 1014 + + + BICOMP + 798 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 + + + BICOMP + 596 918 87 327 642 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 590 + + + __cstat + 1081 + + + BICOMP + 901 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 749 + + + __cstat + 933 + + + BICOMP + 832 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 327 670 48 45 473 67 154 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 871 + + + __cstat + 986 + + + BICOMP + 385 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 65 + + + BICOMP + 962 327 816 596 154 863 433 67 65 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 607 + + + __cstat + 1098 + + + BICOMP + 560 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 135 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 903 + + + __cstat + 1059 + + + BICOMP + 761 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 65 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 782 + + + __cstat + 1000 + + + BICOMP + 576 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 441 + + + __cstat + 1113 + + + BICOMP + 682 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 962 816 596 65 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 429 + + + __cstat + 409 + + + BICOMP + 874 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 65 + + + BICOMP + 863 433 816 45 962 596 67 65 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 912 + + + __cstat + 945 + + + BICOMP + 634 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 962 816 596 102 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 892 + + + __cstat + 1051 + + + BICOMP + 691 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 135 + + + BICOMP + 473 327 438 154 450 67 135 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 578 + + + __cstat + 990 + + + BICOMP + 498 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 327 642 45 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 490 + + + __cstat + 1128 + + + BICOMP + 466 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 135 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 1161 + + + __cstat + 1008 + + + BICOMP + 723 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 327 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 1157 + + + __cstat + 955 + + + BICOMP + 535 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 585 + + + __cstat + 1111 + + + BICOMP + 748 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 567 + + + __cstat + 908 + + + BICOMP + 502 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 135 + + + BICOMP + 473 327 438 154 450 67 135 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 715 + + + __cstat + 940 + + + BICOMP + 769 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 154 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 820 + + + __cstat + 944 + + + BICOMP + 600 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 512 + + + __cstat + 1095 + + + BICOMP + 604 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 962 816 596 102 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 593 + + + __cstat + 888 + + + BICOMP + 711 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 102 + + + BICOMP + 962 327 816 596 154 863 433 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 1110 + + + __cstat + 1045 + + + BICOMP + 648 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 386 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 1153 + + + __cstat + 1102 + + + BICOMP + 533 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 470 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 822 + + + __cstat + 1103 + + + BICOMP + 979 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 327 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 862 + + + __cstat + 904 + + + BICOMP + 714 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 327 45 473 67 154 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 660 + + + __cstat + 1037 + + + BICOMP + 1158 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 486 + + + __cstat + 978 + + + BICOMP + 550 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 48 + + + BICOMP + 670 48 45 473 67 154 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 426 + + + __cstat + 1038 + + + BICOMP + 476 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 824 + + + __cstat + 985 + + + BICOMP + 960 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 48 + + + BICOMP + 670 327 45 473 67 48 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 636 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 873 + + + __cstat + 1002 + + + BICOMP + 768 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 327 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 807 + + + __cstat + 1071 + + + BICOMP + 754 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 684 + + + __cstat + 973 + + + BICOMP + 459 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 102 + + + BICOMP + 327 863 433 816 45 962 596 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 949 + + + __cstat + 975 + + + BICOMP + 856 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 368 + + + BICOMP + 816 368 863 433 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 406 + + + __cstat + 924 + + + BICOMP + 968 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 102 + + + BICOMP + 327 863 433 816 45 962 596 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 545 + + + __cstat + 1036 + + + BICOMP + 701 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 65 + + + BICOMP + 863 433 65 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 546 + + + __cstat + 1101 + + + BICOMP + 801 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 327 438 45 450 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 683 + + + __cstat + 1041 + + + BICOMP + 793 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 45 + + + BICOMP + 596 45 642 87 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 823 + + + __cstat + 1043 + + + BICOMP + 514 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 473 48 670 67 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 1132 + + + __cstat + 932 + + + BICOMP + 492 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 433 102 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 1146 + + + __cstat + 922 + + + BICOMP + 989 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 536 + + + __cstat + 1119 + + + BICOMP + 494 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 919 + + + __cstat + 996 + + + BICOMP + 647 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 854 + + + __cstat + 1087 + + + BICOMP + 700 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 386 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 391 + + + __cstat + 1019 + + + BICOMP + 676 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 102 + + + BICOMP + 863 327 433 102 816 45 962 596 67 154 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 436 + + + __cstat + 965 + + + BICOMP + 741 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 65 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 612 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 484 + + + __cstat + 966 + + + BICOMP + 708 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 473 48 670 67 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 442 + + + __cstat + 1015 + + + BICOMP + 488 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 842 + + + __cstat + 1030 + + + BICOMP + 509 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 608 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 475 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 796 + + + __cstat + 1066 + + + BICOMP + 927 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 135 + + + BICOMP + 473 450 135 45 438 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 783 + + + __cstat + 1020 + + + BICOMP + 521 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 818 + + + __cstat + 1118 + + + BICOMP + 443 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 135 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 561 + + + __cstat + 1029 + + + BICOMP + 980 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 792 + + + __cstat + 951 + + + BICOMP + 747 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 327 450 154 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 705 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 762 + + + __cstat + 1072 + + + BICOMP + 456 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 386 + + + BICOMP + 596 327 642 154 918 67 386 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 587 + + + __cstat + 1053 + + + BICOMP + 505 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 596 918 87 642 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 917 + + + __cstat + 1144 + + + BICOMP + 666 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 478 + + + __cstat + 929 + + + BICOMP + 909 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 969 + + + __cstat + 1076 + + + BICOMP + 485 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 386 + + + BICOMP + 596 327 642 154 918 67 386 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 1133 + + + __cstat + 1096 + + + BICOMP + 563 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 470 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 610 + + + __cstat + 1100 + + + BICOMP + 694 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 386 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 728 + + + __cstat + 1021 + + + BICOMP + 803 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 568 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 765 + + + __cstat + 1026 + + + BICOMP + 772 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 962 816 596 65 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 1145 + + + __cstat + 1075 + + + BICOMP + 889 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 470 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 740 + + + __cstat + 1069 + + + BICOMP + 953 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 621 + + + __cstat + 1001 + + + BICOMP + 900 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 596 918 87 642 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 673 + + + __cstat + 1024 + + + BICOMP + 811 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 450 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 719 + + + __cstat + 402 + + + BICOMP + 819 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 65 + + + BICOMP + 863 433 816 45 962 596 67 65 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 750 + + + __cstat + 1091 + + + BICOMP + 722 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 627 + + + __cstat + 947 + + + BICOMP + 571 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 596 642 386 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 790 + + + __cstat + 1047 + + + BICOMP + 495 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 135 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 551 + + + __cstat + 977 + + + BICOMP + 534 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 615 + + + __cstat + 1057 + + + BICOMP + 668 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 702 + + + __cstat + 1084 + + + BICOMP + 1046 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 368 + + + BICOMP + 816 368 863 433 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 626 + + + __cstat + 958 + + + BICOMP + 687 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 470 + + + BICOMP + 470 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 525 + + + __cstat + 1064 + + + BICOMP + 739 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 135 + + + BICOMP + 473 450 45 438 67 135 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 964 + + + __cstat + 997 + + + BICOMP + 468 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 65 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 501 + + + __cstat + 1027 + + + BICOMP + 848 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 65 + + + BICOMP + 962 327 816 596 154 863 433 67 65 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 592 + + + __cstat + 1089 + + + BICOMP + 541 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 327 438 45 450 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 773 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 981 + + + __cstat + 1025 + + + BICOMP + 630 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 154 + + + BICOMP + 596 154 327 642 45 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 678 + + + __cstat + 1107 + + + BICOMP + 1010 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 918 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 836 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 624 + + + __cstat + 956 + + + BICOMP + 515 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 102 + + + BICOMP + 863 433 327 816 45 962 596 67 102 642 918 438 670 473 450 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 1109 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 38 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 905 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 589 + + + __cstat + 1094 + + + BICOMP + 469 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 48 + + + BICOMP + 473 154 327 670 67 48 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 481 + + + __cstat + 971 + + + BICOMP + 407 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 565 + + + __cstat + 943 + + + BICOMP + 646 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 473 48 670 67 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 496 + + + __cstat + 1061 + + + BICOMP + 656 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 596 918 154 642 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 644 + + + __cstat + 998 + + + BICOMP + 746 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 327 918 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 566 + + + __cstat + 1121 + + + BICOMP + 458 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 962 816 596 102 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 787 + + + __cstat + 1079 + + + BICOMP + 569 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 470 + + + BICOMP + 327 596 918 45 642 67 470 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 757 + + + __cstat + 1005 + + + BICOMP + 696 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 573 + + + __cstat + 939 + + + BICOMP + 1040 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 470 + + + BICOMP + 327 596 918 45 642 67 470 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 724 + + + __cstat + 1151 + + + BICOMP + 403 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 448 + + + __cstat + 1116 + + + BICOMP + 633 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 526 + + + __cstat + 1042 + + + BICOMP + 594 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 470 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 697 + + + __cstat + 887 + + + BICOMP + 923 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 596 642 386 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 712 + + + __cstat + 896 + + + BICOMP + 987 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 596 918 154 327 642 67 87 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 425 + + + __cstat + 890 + + + BICOMP + 672 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 + + + BICOMP + 473 438 45 327 450 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 845 + + + __cstat + 404 + + + BICOMP + 781 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 65 + + + BICOMP + 863 433 65 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 726 + + + __cstat + 1028 + + + BICOMP + 544 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 751 + + + __cstat + 926 + + + BICOMP + 655 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 154 + + + BICOMP + 596 154 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 1123 + + + __cstat + 999 + + + BICOMP + 452 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 930 + + + __cstat + 897 + + + BICOMP + 518 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 671 + + + __cstat + 914 + + + BICOMP + 528 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 48 + + + BICOMP + 670 45 473 67 48 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 590 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 484 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 921 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 38 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 842 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 406 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 824 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 725 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 969 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 163 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 782 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 486 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 1132 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 855 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 684 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 862 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 827 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 627 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 442 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 697 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 762 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 589 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 585 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 1154 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 823 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 565 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 736 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 671 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 749 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 1157 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 391 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 911 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 593 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 34 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 532 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 608 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 760 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 425 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 510 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 568 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 836 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 912 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 522 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 512 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 822 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 675 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 606 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 660 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 546 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 478 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 820 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 34 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 718 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 804 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 1146 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 539 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 624 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 724 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 702 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 37 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 475 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 536 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 905 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 592 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 566 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 949 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 37 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 917 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 496 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 919 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 705 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 678 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 612 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 852 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 792 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 636 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 673 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 783 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 807 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 1142 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 561 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 551 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 728 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 587 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 578 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 1161 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 712 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 644 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 873 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 637 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 621 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 683 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 813 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 764 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 844 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 857 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 981 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 751 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 771 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 523 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 1150 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 1145 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 490 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 526 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 651 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 1153 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 988 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 1112 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 436 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 841 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 876 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 370 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 818 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 615 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 584 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 794 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 964 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 790 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 607 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 44 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 1133 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 33 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 740 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 903 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 39 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 750 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 481 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 715 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 426 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 681 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 663 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 931 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 1134 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 38 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 726 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 547 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 611 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 809 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 1035 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 532 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 606 + + + __cstat + 884 + + + BICOMP + 713 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 438 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 522 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 548 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 677 + + + __cstat + 493 + + + BICOMP + 1135 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 65 + + + BICOMP + 863 433 65 816 45 962 596 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 663 + + + __cstat + 934 + + + BICOMP + 530 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 760 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 851 + + + __cstat + 449 + + + BICOMP + 553 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 962 816 596 65 863 433 67 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 637 + + + __cstat + 1031 + + + BICOMP + 640 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 87 + + + BICOMP + 596 642 45 918 67 87 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 764 + + + __cstat + 1060 + + + BICOMP + 879 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 804 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 524 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 838 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 1142 + + + __cstat + 891 + + + BICOMP + 970 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 327 450 154 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 510 + + + __cstat + 948 + + + BICOMP + 447 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 87 + + + BICOMP + 596 87 642 45 327 918 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 857 + + + __cstat + 1050 + + + BICOMP + 992 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 473 450 154 327 438 67 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 831 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 539 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 609 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 580 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 852 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 813 + + + __cstat + 1018 + + + BICOMP + 847 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 794 + + + __cstat + 1065 + + + BICOMP + 538 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 135 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 718 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 855 + + + __cstat + 995 + + + BICOMP + 727 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 48 + + + BICOMP + 670 45 473 67 48 327 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 988 + + + __cstat + 1016 + + + BICOMP + 457 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 470 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 1110 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 1125 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 785 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 967 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 1159 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 610 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 854 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 577 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 363 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 1123 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 635 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 837 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 448 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 885 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 465 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 777 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 861 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 930 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 487 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 788 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 543 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 574 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 41 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 833 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 625 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 35 43 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 735 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 499 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 37 41 35 42 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 430 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 41 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 707 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 34 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 643 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 757 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 721 + + + + + ICCARM + 32 36 438 596 473 450 642 433 816 962 863 918 670 1062 1074 35 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 537 + + + __cstat + 938 + + + BICOMP + 843 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 470 + + + BICOMP + 327 470 596 918 45 642 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 885 + + + __cstat + 1106 + + + BICOMP + 516 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 1131 + + + __cstat + 1004 + + + BICOMP + 1136 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 386 + + + BICOMP + 473 154 438 67 450 368 386 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 911 + + + __cstat + 946 + + + BICOMP + 774 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 386 + + + BICOMP + 596 918 45 642 67 386 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 1154 + + + __cstat + 895 + + + BICOMP + 742 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 327 642 67 154 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 921 + + + __cstat + 1080 + + + BICOMP + 628 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 45 386 + + + BICOMP + 386 596 918 154 642 67 45 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 1138 + + + __cstat + 517 + + + BICOMP + 491 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 473 438 135 450 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 849 + + + __cstat + 928 + + + BICOMP + 894 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 473 438 135 450 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 529 + + + __cstat + 991 + + + BICOMP + 679 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 135 + + + BICOMP + 473 438 135 450 67 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 685 + + + __cstat + 1099 + + + BICOMP + 591 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 470 + + + BICOMP + 470 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 163 + + + __cstat + 1067 + + + BICOMP + 835 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 596 642 386 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 686 + + + __cstat + 910 + + + BICOMP + 853 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 135 + + + BICOMP + 473 450 135 45 438 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 880 + + + __cstat + 1012 + + + BICOMP + 1048 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 135 + + + BICOMP + 473 438 154 327 450 67 135 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 586 + + + __cstat + 886 + + + BICOMP + 617 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 470 + + + BICOMP + 327 596 918 45 642 67 470 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 721 + + + __cstat + 1032 + + + BICOMP + 817 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 424 + + + __cstat + 882 + + + BICOMP + 489 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 596 642 470 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 552 + + + __cstat + 972 + + + BICOMP + 583 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 135 + + + BICOMP + 473 450 45 438 67 135 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 618 + + + __cstat + 982 + + + BICOMP + 654 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 368 154 87 102 48 470 386 65 135 + + + BICOMP + 102 670 65 45 154 470 327 473 67 368 87 48 386 135 438 450 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 370 + + + __cstat + 872 + + + BICOMP + 859 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 135 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 135 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 725 + + + __cstat + 957 + + + BICOMP + 508 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 386 + + + BICOMP + 386 596 918 45 642 67 154 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 827 + + + __cstat + 952 + + + BICOMP + 454 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 + + + BICOMP + 816 596 962 368 863 433 67 154 327 642 918 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 1147 + + + __cstat + 1022 + + + BICOMP + 1033 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 470 + + + BICOMP + 596 642 470 918 67 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 460 + + + __cstat + 1122 + + + BICOMP + 1124 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 470 + + + BICOMP + 596 642 154 918 67 470 327 863 816 962 433 438 670 473 450 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 465 + + + __cstat + 1120 + + + BICOMP + 639 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 580 + + + __cstat + 959 + + + BICOMP + 507 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 788 + + + __cstat + 1148 + + + BICOMP + 775 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 625 + + + __cstat + 1090 + + + BICOMP + 540 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 386 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 643 + + + __cstat + 984 + + + BICOMP + 631 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 609 + + + __cstat + 1063 + + + BICOMP + 431 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 707 + + + __cstat + 877 + + + BICOMP + 556 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 833 + + + __cstat + 1117 + + + BICOMP + 1141 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 651 + + + __cstat + 942 + + + BICOMP + 704 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 809 + + + __cstat + 941 + + + BICOMP + 935 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 635 + + + __cstat + 1056 + + + BICOMP + 652 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 386 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 547 + + + __cstat + 916 + + + BICOMP + 1127 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 785 + + + __cstat + 1078 + + + BICOMP + 387 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 577 + + + __cstat + 1152 + + + BICOMP + 497 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 841 + + + __cstat + 1052 + + + BICOMP + 850 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 65 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 681 + + + __cstat + 1092 + + + BICOMP + 732 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 931 + + + __cstat + 1097 + + + BICOMP + 834 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 1125 + + + __cstat + 1044 + + + BICOMP + 1143 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 523 + + + __cstat + 878 + + + BICOMP + 554 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 65 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 1150 + + + __cstat + 881 + + + BICOMP + 756 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 470 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 470 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 430 + + + __cstat + 1007 + + + BICOMP + 815 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 102 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 487 + + + __cstat + 1115 + + + BICOMP + 840 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 1058 + + + __cstat + 1011 + + + BICOMP + 812 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 154 135 + + + BICOMP + 473 450 135 45 327 438 67 154 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 831 + + + __cstat + 1034 + + + BICOMP + 766 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 363 + + + __cstat + 1088 + + + BICOMP + 716 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 102 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 1159 + + + __cstat + 1068 + + + BICOMP + 588 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 861 + + + __cstat + 1003 + + + BICOMP + 1006 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 102 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 67 327 791 693 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 611 + + + __cstat + 1077 + + + BICOMP + 767 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 735 + + + __cstat + 1108 + + + BICOMP + 599 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 967 + + + __cstat + 1086 + + + BICOMP + 601 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 838 + + + __cstat + 1105 + + + BICOMP + 689 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 837 + + + __cstat + 950 + + + BICOMP + 632 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 154 48 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 1035 + + + __cstat + 780 + + + BICOMP + 688 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 154 87 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 548 + + + __cstat + 907 + + + BICOMP + 828 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 87 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 543 + + + __cstat + 1054 + + + BICOMP + 720 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 48 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 499 + + + __cstat + 883 + + + BICOMP + 384 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 87 154 48 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 87 154 48 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 876 + + + __cstat + 869 + + + BICOMP + 899 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 65 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 65 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 574 + + + __cstat + 1093 + + + BICOMP + 645 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 102 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 102 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 67 327 564 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 777 + + + __cstat + 1082 + + + BICOMP + 778 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 386 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 386 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 524 + + + __cstat + 1070 + + + BICOMP + 500 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 368 154 87 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 736 + + + __cstat + 954 + + + BICOMP + 1049 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 368 154 87 + + + BICOMP + 473 87 450 368 438 67 154 327 670 863 596 816 962 642 433 918 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 1134 + + + __cstat + 1009 + + + BICOMP + 755 + + + + + ICCARM + 67 327 438 596 473 450 642 433 816 962 863 918 670 45 + + + BICOMP + 67 327 438 596 473 450 642 433 1137 1104 816 863 918 670 45 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 67 327 1039 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 67 327 602 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 67 327 605 693 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 67 327 791 693 605 1039 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 67 327 830 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 67 327 693 791 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 67 327 791 693 605 564 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 67 327 693 527 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 67 327 791 693 605 527 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 67 327 791 693 605 564 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 871 501 719 845 429 765 441 851 677 545 892 567 525 796 552 529 1138 849 686 880 1058 460 787 685 537 586 937 424 1147 626 573 1131 618 736 827 969 921 725 1154 911 627 697 163 442 762 842 589 855 585 1157 862 671 823 565 484 486 749 782 824 391 593 406 590 1132 684 512 912 566 820 660 624 905 522 949 1146 546 718 836 804 532 822 536 675 773 568 539 608 760 606 724 592 425 510 478 702 475 807 678 857 636 917 1142 561 792 981 612 751 783 683 551 712 852 673 771 728 587 578 1161 644 873 844 637 496 705 621 813 764 919 750 481 740 615 426 584 651 715 681 1112 663 931 1134 964 436 841 876 523 903 370 490 818 794 790 607 1150 1133 1145 526 1153 988 610 854 1110 635 777 625 499 577 930 837 1159 465 788 735 543 448 574 861 430 885 707 363 487 785 643 833 967 757 721 1125 1123 609 547 831 726 611 548 524 809 838 1035 580 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 67 327 693 605 791 1140 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 67 327 791 693 605 830 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 67 327 527 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 67 327 605 693 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 67 327 791 693 605 527 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 67 327 602 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 67 327 791 693 605 830 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 67 327 791 693 605 1140 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 67 327 602 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 67 327 1140 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 67 327 791 693 605 1140 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 67 327 693 1039 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 67 327 527 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 67 327 791 693 605 1039 602 527 830 564 1140 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 67 327 830 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 67 327 693 605 1140 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 67 327 564 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 67 327 693 605 830 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 67 327 693 564 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 67 327 693 605 1039 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 67 327 693 527 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 67 327 693 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 67 327 693 791 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 67 327 791 693 605 602 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 67 327 693 605 564 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 67 327 693 605 602 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 67 327 693 605 527 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 67 327 830 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 67 327 605 693 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 67 327 605 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 67 327 693 1140 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 67 327 791 693 605 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 67 327 1140 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 67 327 693 605 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 67 327 1039 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 67 327 693 830 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 67 327 693 602 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 67 327 791 693 605 564 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a7/iar/example_build/tx.ewd b/ports/cortex_a7/iar/example_build/tx.ewd new file mode 100644 index 00000000..4173bf74 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a7/iar/example_build/tx.ewp b/ports/cortex_a7/iar/example_build/tx.ewp new file mode 100644 index 00000000..ef9fb474 --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.ewp @@ -0,0 +1,2763 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a7/iar/example_build/tx.ewt b/ports/cortex_a7/iar/example_build/tx.ewt new file mode 100644 index 00000000..d903833d --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx.ewt @@ -0,0 +1,3424 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a7/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a7/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..c8eabf0c --- /dev/null +++ b/ports/cortex_a7/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a7/iar/inc/tx_port.h b/ports/cortex_a7/iar/inc/tx_port.h new file mode 100644 index 00000000..73ea8e18 --- /dev/null +++ b/ports/cortex_a7/iar/inc/tx_port.h @@ -0,0 +1,393 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A7/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A7/IAR Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + diff --git a/ports/cortex_a7/iar/readme_threadx.txt b/ports/cortex_a7/iar/readme_threadx.txt new file mode 100644 index 00000000..0b12c22c --- /dev/null +++ b/ports/cortex_a7/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A7 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A7 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A7 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A7 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A7 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A7 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A7 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A7 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A7 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a7/iar/src/tx_iar.c b/ports/cortex_a7/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a7/iar/src/tx_thread_context_restore.s b/ports/cortex_a7/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..559c05bf --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_context_save.s b/ports/cortex_a7/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..0751e98a --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..03fb04b5 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,270 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..339e227b --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..87088021 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..671cb6f9 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a7/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..61d091d0 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..27911f58 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..80028df8 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..72b794b6 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..ceed092b --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_schedule.s b/ports/cortex_a7/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..fb11bd10 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_schedule.s @@ -0,0 +1,239 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_stack_build.s b/ports/cortex_a7/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..2ed9f538 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A7 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_system_return.s b/ports/cortex_a7/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..09d927db --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_system_return.s @@ -0,0 +1,162 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..e73b7385 --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a7/iar/src/tx_timer_interrupt.s b/ports/cortex_a7/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..1603243f --- /dev/null +++ b/ports/cortex_a7/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_a8/ac5/example_build/build_threadx.bat b/ports/cortex_a8/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..6cfc7e66 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a8.no_neon -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a8/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a8/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..34540967 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a8.no_neon --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a8.no_neon -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a8/ac5/example_build/sample_threadx.c b/ports/cortex_a8/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..580d5042 --- /dev/null +++ b/ports/cortex_a8/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A8 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a8/ac5/inc/tx_port.h b/ports/cortex_a8/ac5/inc/tx_port.h new file mode 100644 index 00000000..4fb4e180 --- /dev/null +++ b/ports/cortex_a8/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A8/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A8/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a8/ac5/readme_threadx.txt b/ports/cortex_a8/ac5/readme_threadx.txt new file mode 100644 index 00000000..ac883521 --- /dev/null +++ b/ports/cortex_a8/ac5/readme_threadx.txt @@ -0,0 +1,547 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A8 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A8 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A8 Specifies Cortex-A8 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A8 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A8 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A8 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A8 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A8 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A8 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a8/ac5/src/tx_thread_context_restore.s b/ports/cortex_a8/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..905651b4 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_context_save.s b/ports/cortex_a8/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..ff1d228f --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..f41ee539 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore + +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..e31b7ef3 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..a1204696 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..f2fbf4f9 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..c743a36d --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..02439931 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..9d328f1c --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..1999adc1 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..5e1071aa --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_schedule.s b/ports/cortex_a8/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..0e888c7e --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_stack_build.s b/ports/cortex_a8/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..7f7975f2 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A8 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_system_return.s b/ports/cortex_a8/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..3812aa90 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..342e8ba7 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a8/ac5/src/tx_timer_interrupt.s b/ports/cortex_a8/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..b71d49b7 --- /dev/null +++ b/ports/cortex_a8/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A8/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a8/gnu/example_build/build_threadx.bat b/ports/cortex_a8/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..a37a3eab --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a8/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a8/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..aa8c8006 --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a8 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a8 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a8/gnu/example_build/crt0.S b/ports/cortex_a8/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a8/gnu/example_build/libc.a b/ports/cortex_a8/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_a8/gnu/example_build/libc.a differ diff --git a/ports/cortex_a8/gnu/example_build/libgcc.a b/ports/cortex_a8/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_a8/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_a8/gnu/example_build/reset.S b/ports/cortex_a8/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_a8/gnu/example_build/sample_threadx.c b/ports/cortex_a8/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a8/gnu/example_build/sample_threadx.ld b/ports/cortex_a8/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_a8/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_a8/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..2cd32c9e --- /dev/null +++ b/ports/cortex_a8/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_a8/gnu/inc/tx_port.h b/ports/cortex_a8/gnu/inc/tx_port.h new file mode 100644 index 00000000..bb5781f1 --- /dev/null +++ b/ports/cortex_a8/gnu/inc/tx_port.h @@ -0,0 +1,323 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A8/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A8/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a8/gnu/readme_threadx.txt b/ports/cortex_a8/gnu/readme_threadx.txt new file mode 100644 index 00000000..bc4d709a --- /dev/null +++ b/ports/cortex_a8/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A8 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A8 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a8 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a8 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a8 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a8 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A8 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A8 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A8 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a8/gnu/src/tx_thread_context_restore.S b/ports/cortex_a8/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..91b1c150 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_context_save.S b/ports/cortex_a8/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..8c55a18b --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..ee677edf --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..3a3eda70 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..71ac82b3 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..f4ae9a78 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ce0949ec --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..ea6f1193 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..63ca62d9 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..b892370b --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..f8cd2efd --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_schedule.S b/ports/cortex_a8/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..a6e0293f --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a8/gnu/src/tx_thread_stack_build.S b/ports/cortex_a8/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..4de92045 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A8 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a8/gnu/src/tx_thread_system_return.S b/ports/cortex_a8/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..28c756e5 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..96f8d0eb --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a8/gnu/src/tx_timer_interrupt.S b/ports/cortex_a8/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..501b2771 --- /dev/null +++ b/ports/cortex_a8/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A8/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a8/iar/example_build/azure_rtos.eww b/ports/cortex_a8/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a8/iar/example_build/cstartup.s b/ports/cortex_a8/iar/example_build/cstartup.s new file mode 100644 index 00000000..b95efc0e --- /dev/null +++ b/ports/cortex_a8/iar/example_build/cstartup.s @@ -0,0 +1,161 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + ;; Enable the VFP coprocessor. + + MOV r0, #0x40000000 ; Set EN bit in VFP + FMXR fpexc, r0 ; FPEXC, clear others. + +; +; Disable underflow exceptions by setting flush to zero mode. +; For full IEEE 754 underflow compliance this code should be removed +; and the appropriate exception handler installed. +; + + MOV r0, #0x01000000 ; Set FZ bit in VFP + FMXR fpscr, r0 ; FPSCR, clear others. +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.c b/ports/cortex_a8/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c7c300cb --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.dep b/ports/cortex_a8/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..fcb0bb93 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.dep @@ -0,0 +1,222 @@ + + + 4 + 1829555607 + + Debug + + $PROJ_DIR$\sample_threadx.c + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\tx_initialize_low_level.s + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\inc\yvals.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\tx_initialize_low_level.s79 + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\cstartup.s79 + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $TOOLKIT_DIR$\inc\xencoding_limits.h + $TOOLKIT_DIR$\lib\m7Sx_tl.a + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + [ROOT_NODE] + + + ILINK + 52 36 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 30 + + + BICOMP + 49 + + + __cstat + 58 + + + + + ICCARM + 54 56 24 39 15 12 7 2 22 53 27 16 25 55 57 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 34 5 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 13 33 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 17 + + + BICOMP + 18 + + + + + ICCARM + 8 9 23 1 21 28 31 40 45 51 37 4 50 43 + + + BICOMP + 8 9 23 1 21 28 40 45 51 37 4 50 43 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 13 33 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 14 + + + + + ICCARM + 8 9 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 34 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 19 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 38 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 36 + + + + + ILINK + 6 34 30 3 13 47 44 46 48 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.ewd b/ports/cortex_a8/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..9cfde331 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.ewp b/ports/cortex_a8/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..1734412a --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2130 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.ewt b/ports/cortex_a8/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..a8417466 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_a8/iar/example_build/sample_threadx.icf b/ports/cortex_a8/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..8c984b82 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 288 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000000900259600000200000010860000120000000C8100000A000000048600000200000017810000040000000E8100000100000011860000120000004681000003000000E880000003000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 00000000B4040000000A000065050000 + 000000009D040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000006801000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF68010000320000006C010000990400000100000002000010040000000100000027FFFFFF87080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E65008000000100000000000000B4040000000A000065050000000000009D040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..daca6403 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..6103fd44 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..36278b8c --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A8" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..66d13c65 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a8\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a8/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..2488c160 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1385 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 137 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 2F0000000900259600000200000010860000120000000C8100000A000000048600000200000017810000040000000E8100000500000011860000120000004681000003000000E880000003000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 1900578600001800000059920000240000002392000000000000008D00001E00000007860000280000001D9200001100000004860000250000009A860000160000000084000078000000259200001900000044920000220000001A860000320000001F9200001F0000008E8600003B00000006860000270000002D920000210000006986000038000000558600000600000023960000890000000E86000017000000A18600003C000000C386000003000000C08600000A00000005860000260000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000340100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 00000000DC020000DF05000078030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000AA010000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000340100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000DF050000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000DF05000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + 130800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFF0F0800004C000000130800009A040000010000000200001004000000010000001DF9FFFFB9010000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000DF05000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000DF05000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF340100004C000000380100009A040000010000000200001004000000010000006DFFFFFFDC060000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000340100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000020062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..d4670025 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 1043574536 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..36278b8c --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A8" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.crun b/ports/cortex_a8/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.dbgdt b/ports/cortex_a8/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a8/iar/example_build/settings/tx.dnx b/ports/cortex_a8/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a8/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a8/iar/example_build/tx.dep b/ports/cortex_a8/iar/example_build/tx.dep new file mode 100644 index 00000000..d3f1fdc6 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.dep @@ -0,0 +1,9603 @@ + + + 4 + 2050279214 + + Debug + + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Txe_qp.c + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Tx_ike.c + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Txe_efc.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Tx_mc.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Tx_mut.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\Debug\Obj\tx_misra.o + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 606 637 382 41 356 368 404 99 349 35 405 107 708 619 603 111 25 34 647 710 476 627 649 390 553 552 638 13 654 715 742 398 411 67 30 90 26 568 495 475 724 757 5 541 756 6 85 365 40 630 442 486 61 117 119 734 104 447 549 470 402 438 452 562 19 364 490 628 3 435 43 694 443 645 560 730 547 632 711 527 380 639 46 653 123 673 529 44 68 384 674 503 39 589 16 9 525 728 706 396 636 550 77 453 58 759 96 615 741 73 726 669 8 687 599 613 417 596 66 493 52 751 575 717 393 752 487 434 425 497 657 419 537 374 337 395 110 735 426 15 491 429 574 94 354 513 563 400 87 566 604 576 72 761 83 86 383 621 21 64 350 655 602 480 524 543 427 375 105 749 11 109 704 45 519 758 450 733 125 399 746 656 376 2 626 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 133 214 454 727 718 696 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 465 42 573 403 595 496 564 567 611 485 366 721 408 517 593 78 686 642 91 342 646 740 344 378 33 557 505 612 677 583 31 70 394 518 697 979 609 689 49 532 665 676 97 37 54 492 695 572 0 559 474 436 520 556 340 714 122 379 439 587 594 534 339 705 522 578 10 760 79 702 514 89 644 625 502 479 433 359 739 124 458 14 397 600 118 558 571 504 1 523 629 361 707 598 345 750 483 661 103 445 581 658 515 355 472 422 719 703 516 743 412 386 74 521 47 32 569 461 121 535 667 51 501 731 95 48 580 459 736 22 685 539 683 585 610 65 533 643 409 460 388 526 346 508 650 640 468 440 464 387 633 106 60 555 586 507 709 510 372 36 511 745 471 55 456 367 675 591 528 7 431 601 605 607 444 385 451 469 561 414 407 698 723 500 102 424 618 428 92 551 590 352 582 101 4 448 570 663 693 635 672 678 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 133 214 696 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 133 214 454 727 718 700 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 133 214 684 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 133 214 454 727 718 494 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 133 214 441 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 133 214 718 727 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 133 214 454 727 718 737 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 133 214 727 718 454 700 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 611 + + + BICOMP + 349 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 142 + + + BICOMP + 142 699 624 296 536 133 215 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 42 + + + BICOMP + 637 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 142 + + + BICOMP + 214 536 215 699 624 133 142 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 465 + + + BICOMP + 606 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 142 + + + BICOMP + 214 536 215 699 624 133 142 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 721 + + + BICOMP + 107 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 141 + + + BICOMP + 624 506 699 214 680 215 701 467 133 141 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 517 + + + BICOMP + 619 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 141 + + + BICOMP + 699 141 701 467 296 624 680 506 133 215 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 593 + + + BICOMP + 603 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 141 + + + BICOMP + 699 701 467 296 624 680 506 133 141 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 78 + + + BICOMP + 111 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 624 506 699 680 141 701 467 133 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 573 + + + BICOMP + 382 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 142 + + + BICOMP + 699 624 296 536 133 142 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 595 + + + BICOMP + 356 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 142 + + + BICOMP + 699 624 296 536 133 142 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 403 + + + BICOMP + 41 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 142 + + + BICOMP + 142 699 624 296 536 133 215 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 496 + + + BICOMP + 368 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 536 142 699 624 133 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 564 + + + BICOMP + 404 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 536 142 699 624 133 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 485 + + + BICOMP + 35 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 142 + + + BICOMP + 142 699 624 296 536 133 215 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 366 + + + BICOMP + 405 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 141 + + + BICOMP + 624 506 699 214 680 215 701 467 133 141 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 408 + + + BICOMP + 708 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 141 + + + BICOMP + 699 701 467 296 624 680 506 133 141 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 567 + + + BICOMP + 99 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 536 142 699 624 133 214 688 489 506 554 701 680 430 467 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 689 + + + BICOMP + 26 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 296 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 169 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 665 + + + BICOMP + 475 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 169 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 31 + + + BICOMP + 742 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 155 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 583 + + + BICOMP + 715 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 155 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 505 + + + BICOMP + 638 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 697 + + + BICOMP + 30 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 157 215 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 676 + + + BICOMP + 724 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 342 + + + BICOMP + 710 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 141 + + + BICOMP + 624 506 699 680 215 214 701 467 133 141 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 740 + + + BICOMP + 627 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 155 + + + BICOMP + 699 506 489 215 688 554 133 155 214 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 642 + + + BICOMP + 34 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 624 506 699 680 141 701 467 133 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 70 + + + BICOMP + 398 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 157 215 169 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 394 + + + BICOMP + 411 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 157 215 278 233 221 155 169 142 141 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 157 215 278 233 221 155 169 142 141 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 557 + + + BICOMP + 552 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 155 + + + BICOMP + 214 688 554 296 699 489 506 133 155 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 49 + + + BICOMP + 568 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 97 + + + BICOMP + 757 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 33 + + + BICOMP + 553 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 155 + + + BICOMP + 214 155 688 554 296 699 489 506 133 215 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 686 + + + BICOMP + 25 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 624 506 699 680 141 701 467 133 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 37 + + + BICOMP + 5 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 54 + + + BICOMP + 541 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 344 + + + BICOMP + 649 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 155 + + + BICOMP + 214 688 554 296 699 489 506 133 155 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 646 + + + BICOMP + 476 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 141 + + + BICOMP + 699 141 701 467 296 214 624 680 506 133 215 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 677 + + + BICOMP + 654 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 91 + + + BICOMP + 647 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 141 + + + BICOMP + 699 141 701 467 296 624 680 506 133 215 214 430 688 536 489 554 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 532 + + + BICOMP + 495 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 612 + + + BICOMP + 13 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 378 + + + BICOMP + 390 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 155 + + + BICOMP + 155 688 554 296 699 489 506 133 215 214 536 624 701 680 430 467 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 518 + + + BICOMP + 67 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 609 + + + BICOMP + 90 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 169 + + + + + [ROOT_NODE] + + + IARCHIVE + 23 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 661 + + + BICOMP + 123 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 445 + + + BICOMP + 529 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 103 + + + BICOMP + 673 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 629 + + + BICOMP + 711 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 581 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 361 + + + BICOMP + 527 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 707 + + + BICOMP + 380 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 739 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 600 + + + BICOMP + 547 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 479 + + + BICOMP + 443 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 658 + + + BICOMP + 44 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 515 + + + BICOMP + 68 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 355 + + + BICOMP + 384 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 433 + + + BICOMP + 645 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 359 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 502 + + + BICOMP + 694 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 157 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 157 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 1 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 397 + + + BICOMP + 730 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 523 + + + BICOMP + 632 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 345 + + + BICOMP + 46 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 458 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 644 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 14 + + + BICOMP + 560 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 118 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 558 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 571 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 598 + + + BICOMP + 639 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 750 + + + BICOMP + 653 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 157 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 157 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 124 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 504 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 483 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 578 + + + BICOMP + 19 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 233 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 0 + + + BICOMP + 365 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 221 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 79 + + + BICOMP + 628 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 514 + + + BICOMP + 435 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 702 + + + BICOMP + 3 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 89 + + + BICOMP + 43 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 233 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 122 + + + BICOMP + 734 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 587 + + + BICOMP + 549 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 221 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 556 + + + BICOMP + 61 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 10 + + + BICOMP + 364 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 695 + + + BICOMP + 6 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 169 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 474 + + + BICOMP + 630 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 379 + + + BICOMP + 104 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 522 + + + BICOMP + 562 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 436 + + + BICOMP + 442 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 492 + + + BICOMP + 756 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 169 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 169 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 340 + + + BICOMP + 117 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 559 + + + BICOMP + 40 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 520 + + + BICOMP + 486 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 221 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 439 + + + BICOMP + 447 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 221 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 572 + + + BICOMP + 85 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 221 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 534 + + + BICOMP + 402 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 233 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 215 233 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 705 + + + BICOMP + 452 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 760 + + + BICOMP + 490 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 714 + + + BICOMP + 119 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 594 + + + BICOMP + 470 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 233 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 215 233 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 339 + + + BICOMP + 438 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 233 + + + BICOMP + 133 214 688 506 699 489 430 467 725 449 624 701 554 536 296 233 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 510 + + + BICOMP + 491 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 471 + + + BICOMP + 513 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 169 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 55 + + + BICOMP + 563 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 633 + + + BICOMP + 374 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 141 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 460 + + + BICOMP + 575 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 526 + + + BICOMP + 393 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 533 + + + BICOMP + 493 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 610 + + + BICOMP + 596 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 709 + + + BICOMP + 15 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 155 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 585 + + + BICOMP + 417 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 555 + + + BICOMP + 110 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 141 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 372 + + + BICOMP + 429 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 464 + + + BICOMP + 419 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 141 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 409 + + + BICOMP + 751 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 508 + + + BICOMP + 487 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 142 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 640 + + + BICOMP + 425 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 142 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 650 + + + BICOMP + 434 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 142 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 36 + + + BICOMP + 574 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 155 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 511 + + + BICOMP + 94 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 169 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 745 + + + BICOMP + 354 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 169 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 440 + + + BICOMP + 657 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 142 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 468 + + + BICOMP + 497 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 142 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 60 + + + BICOMP + 395 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 141 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 106 + + + BICOMP + 337 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 141 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 643 + + + BICOMP + 52 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 388 + + + BICOMP + 717 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 586 + + + BICOMP + 735 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 155 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 65 + + + BICOMP + 66 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 346 + + + BICOMP + 752 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 142 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 142 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 387 + + + BICOMP + 537 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 141 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 141 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 507 + + + BICOMP + 426 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 155 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 155 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 703 + + + BICOMP + 39 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 215 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 472 + + + BICOMP + 674 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 386 + + + BICOMP + 525 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 74 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 521 + + + BICOMP + 728 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 47 + + + BICOMP + 706 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 32 + + + BICOMP + 396 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 461 + + + BICOMP + 550 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 731 + + + BICOMP + 615 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 95 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 743 + + + BICOMP + 16 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 296 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 48 + + + BICOMP + 741 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 501 + + + BICOMP + 96 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 422 + + + BICOMP + 503 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 215 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 580 + + + BICOMP + 73 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 459 + + + BICOMP + 726 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 22 + + + BICOMP + 8 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 719 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 736 + + + BICOMP + 669 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 516 + + + BICOMP + 589 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 667 + + + BICOMP + 58 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 121 + + + BICOMP + 77 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 535 + + + BICOMP + 453 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 278 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 51 + + + BICOMP + 759 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 685 + + + BICOMP + 687 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 539 + + + BICOMP + 599 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 683 + + + BICOMP + 613 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 569 + + + BICOMP + 636 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 412 + + + BICOMP + 9 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 296 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 296 215 278 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 92 + + + BICOMP + 109 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 582 + + + BICOMP + 758 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 101 + + + BICOMP + 450 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 551 + + + BICOMP + 704 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 451 + + + BICOMP + 64 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 233 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 102 + + + BICOMP + 375 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 4 + + + BICOMP + 733 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 448 + + + BICOMP + 125 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 500 + + + BICOMP + 427 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 456 + + + BICOMP + 400 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 169 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 385 + + + BICOMP + 21 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 528 + + + BICOMP + 576 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 601 + + + BICOMP + 83 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 431 + + + BICOMP + 761 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 7 + + + BICOMP + 72 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 605 + + + BICOMP + 86 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 444 + + + BICOMP + 621 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 221 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 469 + + + BICOMP + 350 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 233 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 591 + + + BICOMP + 604 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 407 + + + BICOMP + 480 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 675 + + + BICOMP + 566 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 278 215 221 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 698 + + + BICOMP + 524 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 424 + + + BICOMP + 105 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 618 + + + BICOMP + 749 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 428 + + + BICOMP + 11 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 414 + + + BICOMP + 602 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 367 + + + BICOMP + 87 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 169 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 157 169 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 590 + + + BICOMP + 45 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 607 + + + BICOMP + 383 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 215 221 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 215 221 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 723 + + + BICOMP + 543 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 233 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 352 + + + BICOMP + 519 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 561 + + + BICOMP + 655 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 233 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 233 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 133 214 684 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 693 + + + BICOMP + 656 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 133 214 441 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 663 + + + BICOMP + 746 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 157 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 157 215 278 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 635 + + + BICOMP + 376 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 672 + + + BICOMP + 2 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 215 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 215 278 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 570 + + + BICOMP + 399 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 678 + + + BICOMP + 626 + + + + + ICCARM + 133 214 688 506 699 489 430 467 624 680 701 554 536 278 + + + BICOMP + 133 214 688 506 699 489 467 725 449 624 701 554 536 278 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 133 214 700 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 133 214 454 727 718 441 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 133 214 454 727 718 700 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 133 214 454 727 718 494 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 133 214 494 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 133 214 727 454 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 133 214 718 727 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 133 214 727 684 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 133 214 454 727 718 494 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 133 214 454 727 718 737 684 441 696 494 700 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 133 214 727 441 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 133 214 454 727 718 696 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 133 214 727 441 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 133 214 737 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 133 214 727 718 441 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 133 214 454 727 718 441 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 133 214 727 737 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 133 214 727 718 696 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 133 214 454 727 718 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 133 214 727 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 133 214 727 718 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 133 214 727 718 494 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 133 214 718 727 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 133 214 700 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 133 214 684 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 133 214 727 700 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 133 214 737 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 133 214 718 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 133 214 727 718 700 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 133 214 454 727 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 133 214 727 494 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 133 214 727 454 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 133 214 696 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 133 214 727 696 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 133 214 454 727 718 684 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 133 214 696 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 133 214 727 718 684 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 133 214 494 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 133 214 727 718 737 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 74 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 95 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 581 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 359 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 558 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 1 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 719 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 124 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 644 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 70 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 770 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 739 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 483 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 571 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 625 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 118 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 458 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 504 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 10 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 89 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 14 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 523 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 702 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 629 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 658 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 515 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 707 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 514 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 760 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 345 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 355 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 472 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 598 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 703 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 516 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 79 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 578 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 661 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 422 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 743 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 479 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 502 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 766 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 600 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 750 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 766 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 361 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 397 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 433 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 103 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 445 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 522 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 521 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 412 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 32 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 569 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 51 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 501 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 47 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 731 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 736 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 461 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 667 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 48 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 121 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 580 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 535 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 22 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 386 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 683 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 459 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 685 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 539 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 610 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 65 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 585 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 533 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 643 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 460 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 409 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 555 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 508 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 387 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 709 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 510 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 633 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 511 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 36 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 106 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 507 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 372 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 745 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 367 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 464 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 388 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 586 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 55 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 526 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 468 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 471 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 60 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 440 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 456 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 675 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 591 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 650 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 640 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 528 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 7 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 346 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 431 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 601 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 605 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 698 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 551 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 582 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 561 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 500 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 607 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 444 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 618 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 102 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 414 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 428 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 92 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 352 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 4 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 448 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 570 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 663 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 693 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 635 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 672 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 469 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 678 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 101 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 590 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 385 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 451 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 407 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 723 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 424 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 91 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 378 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 642 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 567 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 408 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 403 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 485 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 573 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 517 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 342 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 646 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 344 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 686 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 505 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 31 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 394 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 766 776 774 767 773 769 770 772 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 583 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 611 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 564 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 366 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 465 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 721 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 42 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 593 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 595 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 496 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 772 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 78 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 765 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 740 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 33 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 612 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 677 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 769 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 676 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 689 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 764 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 97 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 520 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 340 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 379 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 714 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 439 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 587 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 37 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 54 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 594 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 705 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 534 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 339 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 767 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 49 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 518 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 774 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 572 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 559 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 695 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 492 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 474 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 436 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 609 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 665 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 532 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 770 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 0 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 122 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 764 776 773 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 697 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 766 776 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 979 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 776 764 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 556 + + + + + ICCARM + 768 915 688 506 699 489 430 467 624 680 701 554 536 775 771 773 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a8/iar/example_build/tx.ewd b/ports/cortex_a8/iar/example_build/tx.ewd new file mode 100644 index 00000000..897111f4 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a8/iar/example_build/tx.ewp b/ports/cortex_a8/iar/example_build/tx.ewp new file mode 100644 index 00000000..46b5c4d6 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.ewp @@ -0,0 +1,2766 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a8/iar/example_build/tx.ewt b/ports/cortex_a8/iar/example_build/tx.ewt new file mode 100644 index 00000000..2149bed8 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx.ewt @@ -0,0 +1,3427 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a8/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a8/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..5dce3ab5 --- /dev/null +++ b/ports/cortex_a8/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a8/iar/inc/tx_port.h b/ports/cortex_a8/iar/inc/tx_port.h new file mode 100644 index 00000000..3ff8ef9b --- /dev/null +++ b/ports/cortex_a8/iar/inc/tx_port.h @@ -0,0 +1,397 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A8/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A8. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A8/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_a8/iar/readme_threadx.txt b/ports/cortex_a8/iar/readme_threadx.txt new file mode 100644 index 00000000..e46fdee8 --- /dev/null +++ b/ports/cortex_a8/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A8 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A8 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A8 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A8 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A8 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A8 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A8 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A8 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A8 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A8 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a8/iar/src/tx_iar.c b/ports/cortex_a8/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a8/iar/src/tx_thread_context_restore.s b/ports/cortex_a8/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..4a66c503 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_context_save.s b/ports/cortex_a8/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..0d4256ea --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..3036be83 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,270 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..fb54ea4c --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..cc8bb560 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..7d1ef512 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a8/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..4a409e4b --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..552ebed1 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..7d0750c1 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..6da2fdcb --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..8d9efeff --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_schedule.s b/ports/cortex_a8/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..865fb9dd --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_schedule.s @@ -0,0 +1,239 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts +#else + CPSIE i ; Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_stack_build.s b/ports/cortex_a8/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..f5f4da77 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A8 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_system_return.s b/ports/cortex_a8/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..814bc727 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_system_return.s @@ -0,0 +1,162 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + ORR r2, r1, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r2 ; Disable interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..efd958c2 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a8/iar/src/tx_timer_interrupt.s b/ports/cortex_a8/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d7a98738 --- /dev/null +++ b/ports/cortex_a8/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A8/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_a9/ac5/example_build/build_threadx.bat b/ports/cortex_a9/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..328e013b --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-a9.no_neon --fpu=softvfp -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a9/ac5/example_build/build_threadx_sample.bat b/ports/cortex_a9/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..0350727e --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-a9.no_neon --fpu=softvfp --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-a9.no_neon --fpu=softvfp -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_a9/ac5/example_build/sample_threadx.c b/ports/cortex_a9/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..4bec5bf9 --- /dev/null +++ b/ports/cortex_a9/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,414 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size + +VFPEnable EQU 0x40000000 ; VFP enable value + +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-A9 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=Reset_Vector ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + EXPORT Reset_Vector +Reset_Vector + + IF {TARGET_FPU_VFP} = {TRUE} + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #VFPEnable ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 + ENDIF + + B __main +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_a9/ac5/inc/tx_port.h b/ports/cortex_a9/ac5/inc/tx_port.h new file mode 100644 index 00000000..bc92b621 --- /dev/null +++ b/ports/cortex_a9/ac5/inc/tx_port.h @@ -0,0 +1,334 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A9/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-A5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a9/ac5/readme_threadx.txt b/ports/cortex_a9/ac5/readme_threadx.txt new file mode 100644 index 00000000..b05b8f73 --- /dev/null +++ b/ports/cortex_a9/ac5/readme_threadx.txt @@ -0,0 +1,545 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A9 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A9 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-A9 Specifies Cortex-A9 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A9 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-A9 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a9/ac5/src/tx_thread_context_restore.s b/ports/cortex_a9/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..5c5259a7 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_context_save.s b/ports/cortex_a9/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..ec7710aa --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..a5484af5 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..371ac248 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..a3b20759 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..221258d5 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..4c4a7c38 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..c15f0bdf --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..955544e7 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..7b91c316 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..d1a25514 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_schedule.s b/ports/cortex_a9/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..10bbe36a --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_schedule.s @@ -0,0 +1,236 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_stack_build.s b/ports/cortex_a9/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..0364ba18 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,165 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF + +;} + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_system_return.s b/ports/cortex_a9/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..c4ae7a15 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_system_return.s @@ -0,0 +1,159 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..c74480a5 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_a9/ac5/src/tx_timer_interrupt.s b/ports/cortex_a9/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..1fdec243 --- /dev/null +++ b/ports/cortex_a9/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A9/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_a9/gnu/example_build/build_threadx.bat b/ports/cortex_a9/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..668eb5c7 --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_a9/gnu/example_build/build_threadx_sample.bat b/ports/cortex_a9/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..e6ddefad --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-a9 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-a9 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_a9/gnu/example_build/crt0.S b/ports/cortex_a9/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_a9/gnu/example_build/libc.a b/ports/cortex_a9/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_a9/gnu/example_build/libc.a differ diff --git a/ports/cortex_a9/gnu/example_build/libgcc.a b/ports/cortex_a9/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_a9/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_a9/gnu/example_build/reset.S b/ports/cortex_a9/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_a9/gnu/example_build/sample_threadx.c b/ports/cortex_a9/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a9/gnu/example_build/sample_threadx.ld b/ports/cortex_a9/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_a9/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_a9/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..4f77c8ad --- /dev/null +++ b/ports/cortex_a9/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_a9/gnu/inc/tx_port.h b/ports/cortex_a9/gnu/inc/tx_port.h new file mode 100644 index 00000000..9e519bbc --- /dev/null +++ b/ports/cortex_a9/gnu/inc/tx_port.h @@ -0,0 +1,323 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A9/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_a9/gnu/readme_threadx.txt b/ports/cortex_a9/gnu/readme_threadx.txt new file mode 100644 index 00000000..684e996f --- /dev/null +++ b/ports/cortex_a9/gnu/readme_threadx.txt @@ -0,0 +1,513 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A9 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A9 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-a9 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-a9 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) a9 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 a9 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A9 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-A9 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a9/gnu/src/tx_thread_context_restore.S b/ports/cortex_a9/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..3e85f010 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,257 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_context_save.S b/ports/cortex_a9/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..59370609 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..2aa3606b --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..970ddfd0 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..a9e545bc --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..85bbbb41 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..54557d55 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..3f6b5de5 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..b4469688 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..955667ca --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..65a24d7f --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_schedule.S b/ports/cortex_a9/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..78d18a2e --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_schedule.S @@ -0,0 +1,255 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + MOV r5, r0 @ Save r0 + BL _tx_execution_thread_enter @ Call the thread execution enter function + MOV r0, r5 @ Restore r0 +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + VLDMIA sp!, {D16-D31} @ Recover D16-D31 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 @ Recover CPSR + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ + +#ifdef TX_ENABLE_VFP_SUPPORT + + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller + +#endif + diff --git a/ports/cortex_a9/gnu/src/tx_thread_stack_build.S b/ports/cortex_a9/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..e4724f6e --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the Cortex-A9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_a9/gnu/src/tx_thread_system_return.S b/ports/cortex_a9/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..c7123974 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_system_return.S @@ -0,0 +1,180 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + + LDR r4, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r5, [r4] @ Pickup current thread pointer + +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r5, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r1, FPSCR @ Pickup the FPSCR + STR r1, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D16-D31} @ Save D16-D31 + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 @ Build a solicited stack type + MRS r1, CPSR @ Pickup the CPSR + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif + MOV r3, r4 @ Pickup address of current ptr + MOV r0, r5 @ Pickup current thread pointer + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r0, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r0, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r3] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..7c588776 --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_a9/gnu/src/tx_timer_interrupt.S b/ports/cortex_a9/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..00512a4d --- /dev/null +++ b/ports/cortex_a9/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-A9/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_a9/iar/example_build/azure_rtos.eww b/ports/cortex_a9/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_a9/iar/example_build/cstartup.s b/ports/cortex_a9/iar/example_build/cstartup.s new file mode 100644 index 00000000..647de2e8 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/cstartup.s @@ -0,0 +1,156 @@ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 14520 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __vector_0x14 + PUBLIC __iar_program_start + EXTERN __tx_undefined + EXTERN __tx_swi_interrupt + EXTERN __tx_prefetch_handler + EXTERN __tx_abort_handler + EXTERN __tx_irq_handler + EXTERN __tx_fiq_handler + + ARM +__vector: + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort +__vector_0x14: + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD __tx_undefined +SWI_Addr: DCD __tx_swi_interrupt +Prefetch_Addr: DCD __tx_prefetch_handler +Abort_Addr: DCD __tx_abort_handler +IRQ_Addr: DCD __tx_irq_handler +FIQ_Addr: DCD __tx_fiq_handler + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reser execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + +; PUBLIC ?cstartup + EXTERN ?main + REQUIRE __vector + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR + +USR_MODE DEFINE 0x10 ; User mode +FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode +IRQ_MODE DEFINE 0x12 ; Interrupt Request mode +SVC_MODE DEFINE 0x13 ; Supervisor mode +ABT_MODE DEFINE 0x17 ; Abort mode +UND_MODE DEFINE 0x1B ; Undefined Instruction mode +SYS_MODE DEFINE 0x1F ; System mode + + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + +#ifdef __ARMVFP__ + MRC p15, 0, r1, c1, c0, 2 ; r1 = Access Control Register + ORR r1, r1, #(0xf << 20) ; Enable full access for p10,11 + MCR p15, 0, r1, c1, c0, 2 ; Access Control Register = r1 + MOV r1, #0 + MCR p15, 0, r1, c7, c5, 4 ; Flush prefetch buffer because of FMXR below and + ; CP 10 & 11 were only just enabled + MOV r0, #0x40000000 ; Enable VFP itself + FMXR FPEXC, r0 ; FPEXC = r0 +#endif + +; +; Add more initialization here +; + +; Continue to ?main for C-level initialization. + + B ?main + + END + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.c b/ports/cortex_a9/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c7c300cb --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.dep b/ports/cortex_a9/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..714728f2 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.dep @@ -0,0 +1,220 @@ + + + 4 + 512928594 + + Debug + + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\sample_threadx.c + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\TX_ILL.s79 + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\stdlib.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\lib\m7Sx_tlv.a + $TOOLKIT_DIR$\inc\DLib_Threads.h + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\ysizet.h + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\inc\DLib_Product.h + $TOOLKIT_DIR$\lib\dl7Sx_tln.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\lib\rt7Sx_tl.a + $TOOLKIT_DIR$\lib\sh7Sxs_l.a + $TOOLKIT_DIR$\inc\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\tx_cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $TOOLKIT_DIR$\inc\intrinsics.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + + + [ROOT_NODE] + + + ILINK + 15 40 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 11 19 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 43 + + + __cstat + 55 + + + BICOMP + 50 + + + + + ICCARM + 57 56 21 5 35 53 45 46 41 32 20 51 49 59 58 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 2 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 29 + + + + + ICCARM + 0 1 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 42 16 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 40 + + + + + ILINK + 27 42 43 12 11 37 36 23 31 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 11 19 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 47 + + + BICOMP + 39 + + + + + ICCARM + 0 1 14 38 33 18 25 30 6 24 26 8 22 48 + + + BICOMP + 0 1 14 38 33 18 30 6 24 26 8 22 48 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 17 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 42 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.ewd b/ports/cortex_a9/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..9cfde331 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.ewp b/ports/cortex_a9/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..cdcbc403 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2136 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_api.h + + + $PROJ_DIR$\tx_initialize_low_level.s + + + $PROJ_DIR$\tx_port.h + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.ewt b/ports/cortex_a9/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..a30fa4d3 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2797 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_api.h + + + $PROJ_DIR$\tx_initialize_low_level.s + + + $PROJ_DIR$\tx_port.h + + + diff --git a/ports/cortex_a9/iar/example_build/sample_threadx.icf b/ports/cortex_a9/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..9c95e1d1 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..b0ed62eb --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 248 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0100000009002596000002000000108600001F0000000C8100000E000000048600000200000017810000070000000E81000001000000118600001F0000004681000003000000E880000004000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 00000000B4040000000A000065050000 + 000000009D040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000004001000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF400100003200000044010000990400000100000002000010040000000100000070FFFFFFD0080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E65008000000100000000000000B4040000000A000065050000000000009D040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..94aadadb --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..63278961 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..a969962f --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A9" + +"--fpu=VFPv3Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..1f2b1698 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_a9\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.crun b/ports/cortex_a9/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..cd1843d2 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1397 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + 34128 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 139 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 5300000009002596000002000000108600001F0000000C8100000E000000048600000200000017810000070000000E81000007000000118600001F0000004681000003000000E880000004000000 + + + 1000FFFFFFFF8386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 2800578600001800000059920000240000001581000055000000239200000000000007E100006B00000004E10000690000000786000028000000008D00001E0000001D920000110000000D8000004700000001E100006600000004860000250000009A860000160000001781000057000000008400007800000025920000190000001481000054000000449200002200000000810000490000001A860000320000001F9200001F00000003E100006800000006860000270000008E8600003B0000002D9200002100000000E1000065000000698600003800000041E10000750000005586000006000000239600008900000016810000560000000E86000017000000518400008600000005E100006A000000C386000003000000A18600003C00000002E10000670000000586000026000000C08600000A0000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000DB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34056 + 59080000740000007B09000024010000 + 04000000E0020000DB0500005E030000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34066 + 59080000740000007B09000024010000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34067 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34068 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34114 + 59080000740000007B09000024010000 + 04000000B6040000DB05000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 5908000074000000D90A000004010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 5908000074000000070A000004010000 + 040000004C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 59080000740000007B09000024010000 + 0000000048020000DF050000C4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34059 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34061 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 59080000740000005F090000D4010000 + D904000032000000DF050000C4020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 1 + 1 + + Disassembly + _I0 + + + 500 + 20 + + + + + 34069 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 59080000740000007B09000034010000 + 040000001C020000DB050000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 59080000740000005F090000D4010000 + 040000004A00000002010000AA020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34123 + 59080000740000005F090000D4010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34106 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 5908000074000000070A000034010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 59080000740000007B09000024010000 + 0A01000014020000D5040000C4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 59080000740000007B09000024010000 + 0A01000060010000D504000010020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34118 + 59080000740000007B09000024010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 59080000740000005F090000D4010000 + 210800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34120 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34122 + 59080000740000005F090000D4010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000001000000FFFFFFFFFFFFFFFF1D0800004C000000210800009A04000001000000020000100400000001000000C3F8FFFF5F010000478500000000000000000000000000000000000001000000478500000100000047850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100005C010000D504000060010000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000010020000D504000014020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000DB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4B85000001000000FFFFFFFF4B850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000DF05000004020000000000000100000004000000010000000000000000000000FFFFFFFF040000001C8500001D8500001E8500001F85000001800080000000000000000000001B020000DF050000DB0200000000000004020000DF050000C4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001E85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001F85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1C85000001000000FFFFFFFF1C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000040000000000000FFFFFFFFFFFFFFFFD504000032000000D9040000C4020000000000000200000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000030020000DF05000034020000000000000100000004000000010000000000000000000000FFFFFFFF010000002185000001800080000000000000000000004B020000DF050000DB0200000000000034020000DF050000C4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002185000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2185000001000000FFFFFFFF21850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500001085000012850000138500001485000036850000428500000180008000000100000000000000DF020000DF0500008F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300010000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001485000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004285000001000000FFFFFFFFFFFFFFFF02000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100001004000000010000000000000000000000508500000000000000000000000000000000000001000000508500000100000050850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000065000000FFFEFF000000000000000000000000000100000001000000018001E100000000000066000000FFFEFF000000000000000000000000000100000001000000018003E100000000040068000000FFFEFF0000000000000000000000000001000000010000000180008100000000000049000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004006B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040072000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040073000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040070000000FFFEFF000000000000000000000000000100000001000000018029E100000000040071000000FFFEFF000000000000000000000000000100000001000000018002810000000004004B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040060000000FFFEFF000000000000000000000000000100000001000000018027810000000004005E000000FFFEFF000000000000000000000000000100000001000000018028810000000004005F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040058000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040059000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000050000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000064000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F810000000000005A000000FFFEFF000000000000000000000000000100000001000000018020810000000000005B000000FFFEFF0000000000000000000000000001000000010000000180468100000000000062000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34127 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34128 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34124 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..f612528c --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,100 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 79500869 + + + 0 + 0 + 0 + + + 1 + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..256ebf4d --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..6a1889c0 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..a969962f --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-A9" + +"--fpu=VFPv3Neon" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..deeeb2f9 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0_2\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.crun b/ports/cortex_a9/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.dbgdt b/ports/cortex_a9/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_a9/iar/example_build/settings/tx.dnx b/ports/cortex_a9/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_a9/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_a9/iar/example_build/tx.dep b/ports/cortex_a9/iar/example_build/tx.dep new file mode 100644 index 00000000..a1dc2578 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.dep @@ -0,0 +1,9593 @@ + + + 4 + 607583892 + + Debug + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Tx_bytd.c + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Txe_bpp.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Tx_efcle.c + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Txe_sp.c + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\Debug\Obj\tx_misra.o + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 560 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 585 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 633 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 141 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 618 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 592 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 328 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 611 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 645 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 174 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 448 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 752 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 455 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 490 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 454 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 755 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 580 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 570 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 663 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 641 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 715 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 465 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 159 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 502 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 576 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 656 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 725 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 793 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 318 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 487 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 545 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 136 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 629 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 598 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 759 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 722 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 605 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 604 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 599 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 670 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 439 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 527 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 480 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 631 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 531 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 653 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 689 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 468 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 150 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 624 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 113 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 682 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 600 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 528 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 323 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 621 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 552 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 635 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 555 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 602 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 547 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 912 + + + + + [ROOT_NODE] + + + IARCHIVE + 678 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 516 + + + BICOMP + 462 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 70 + + + BICOMP + 218 720 223 524 726 62 70 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 509 + + + BICOMP + 386 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 70 + + + BICOMP + 70 524 726 269 720 62 223 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 445 + + + BICOMP + 703 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 70 + + + BICOMP + 70 524 726 269 720 62 223 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 321 + + + BICOMP + 463 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 720 70 524 726 62 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 677 + + + BICOMP + 782 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 76 + + + BICOMP + 524 735 507 269 726 521 529 62 76 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 775 + + + BICOMP + 305 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 70 + + + BICOMP + 218 720 223 524 726 62 70 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 538 + + + BICOMP + 730 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 726 529 524 521 76 735 507 62 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 566 + + + BICOMP + 478 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 720 70 524 726 62 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 129 + + + BICOMP + 168 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 720 70 524 726 62 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 152 + + + BICOMP + 127 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 70 + + + BICOMP + 70 524 726 269 720 62 223 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 637 + + + BICOMP + 808 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 76 + + + BICOMP + 726 529 524 218 521 223 735 507 62 76 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 721 + + + BICOMP + 418 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 70 + + + BICOMP + 524 726 269 720 62 70 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 779 + + + BICOMP + 769 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 76 + + + BICOMP + 726 529 524 218 521 223 735 507 62 76 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 790 + + + BICOMP + 133 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 70 + + + BICOMP + 524 726 269 720 62 70 218 456 440 529 567 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 313 + + + BICOMP + 517 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 76 + + + BICOMP + 524 735 507 269 726 521 529 62 76 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 563 + + + BICOMP + 121 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 76 + + + BICOMP + 524 76 735 507 269 726 521 529 62 223 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 792 + + + BICOMP + 535 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 524 529 440 97 456 567 62 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 457 + + + BICOMP + 639 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 97 + + + BICOMP + 524 529 440 223 456 567 62 97 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 626 + + + BICOMP + 515 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 726 529 524 521 76 735 507 62 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 128 + + + BICOMP + 508 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 76 + + + BICOMP + 726 529 524 521 223 218 735 507 62 76 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 642 + + + BICOMP + 691 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 100 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 472 + + + BICOMP + 170 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 100 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 402 + + + BICOMP + 593 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 76 + + + BICOMP + 524 76 735 507 269 218 726 521 529 62 223 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 447 + + + BICOMP + 764 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 522 + + + BICOMP + 719 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 97 + + + BICOMP + 97 456 567 269 524 440 529 62 223 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 142 + + + BICOMP + 138 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 100 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 330 + + + BICOMP + 116 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 726 529 524 521 76 735 507 62 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 607 + + + BICOMP + 322 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 524 529 440 97 456 567 62 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 601 + + + BICOMP + 397 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 524 529 440 97 456 567 62 218 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 394 + + + BICOMP + 137 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 94 223 256 207 210 97 100 70 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 94 223 256 207 210 97 100 70 76 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 745 + + + BICOMP + 143 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 97 + + + BICOMP + 218 456 567 269 524 440 529 62 97 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 380 + + + BICOMP + 396 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 424 + + + BICOMP + 497 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 488 + + + BICOMP + 164 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 97 + + + BICOMP + 218 456 567 269 524 440 529 62 97 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + BICOMP + 753 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 688 + + + BICOMP + 173 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 76 + + + BICOMP + 524 76 735 507 269 726 521 529 62 223 218 410 456 720 440 567 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 634 + + + BICOMP + 162 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 684 + + + BICOMP + 370 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 743 + + + BICOMP + 489 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 269 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 269 100 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 785 + + + BICOMP + 695 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 398 + + + BICOMP + 493 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 97 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 628 + + + BICOMP + 147 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 97 + + + BICOMP + 218 97 456 567 269 524 440 529 62 223 720 726 735 521 410 507 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 584 + + + BICOMP + 413 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 97 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 650 + + + BICOMP + 581 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 62 218 406 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 62 218 558 533 498 406 800 710 475 780 739 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 62 218 739 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 166 + + + BICOMP + 805 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 661 + + + BICOMP + 646 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 513 + + + BICOMP + 559 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 416 + + + BICOMP + 148 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 94 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 94 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 655 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 797 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 636 + + + BICOMP + 451 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 379 + + + BICOMP + 596 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 696 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 408 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 144 + + + BICOMP + 432 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 589 + + + BICOMP + 683 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 436 + + + BICOMP + 442 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 486 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 511 + + + BICOMP + 464 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 94 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 94 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 758 + + + BICOMP + 595 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 431 + + + BICOMP + 461 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 649 + + + BICOMP + 597 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 733 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 763 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 822 + + + BICOMP + 708 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 765 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 757 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 704 + + + BICOMP + 582 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 526 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 548 + + + BICOMP + 679 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 786 + + + BICOMP + 382 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 578 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 519 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 809 + + + BICOMP + 415 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 134 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 474 + + + BICOMP + 588 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 429 + + + BICOMP + 564 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 787 + + + BICOMP + 741 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 438 + + + BICOMP + 320 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 627 + + + BICOMP + 466 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 310 + + + BICOMP + 369 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 702 + + + BICOMP + 778 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 434 + + + BICOMP + 700 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 207 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 666 + + + BICOMP + 501 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 319 + + + BICOMP + 806 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 706 + + + BICOMP + 795 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 207 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 762 + + + BICOMP + 496 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 617 + + + BICOMP + 623 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 207 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 731 + + + BICOMP + 727 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 207 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 699 + + + BICOMP + 606 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 207 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 562 + + + BICOMP + 783 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 100 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 443 + + + BICOMP + 686 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 804 + + + BICOMP + 510 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 311 + + + BICOMP + 534 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 546 + + + BICOMP + 744 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 324 + + + BICOMP + 171 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 301 + + + BICOMP + 512 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 100 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 541 + + + BICOMP + 543 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 210 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 139 + + + BICOMP + 118 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 210 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 385 + + + BICOMP + 375 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 210 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 620 + + + BICOMP + 815 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 754 + + + BICOMP + 409 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 210 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 132 + + + BICOMP + 813 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 210 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 609 + + + BICOMP + 814 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 439 + + + BICOMP + 530 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 468 + + + BICOMP + 417 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 670 + + + BICOMP + 373 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 527 + + + BICOMP + 441 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 673 + + + BICOMP + 644 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 680 + + + BICOMP + 788 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 632 + + + BICOMP + 692 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 569 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 772 + + + BICOMP + 383 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 223 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 160 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 427 + + + BICOMP + 667 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 481 + + + BICOMP + 750 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 781 + + + BICOMP + 565 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 123 + + + BICOMP + 694 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 643 + + + BICOMP + 575 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 223 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 657 + + + BICOMP + 773 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 556 + + + BICOMP + 789 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 452 + + + BICOMP + 572 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 125 + + + BICOMP + 819 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 761 + + + BICOMP + 751 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 539 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 777 + + + BICOMP + 470 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 471 + + + BICOMP + 316 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 114 + + + BICOMP + 709 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 256 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 514 + + + BICOMP + 717 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 689 + + + BICOMP + 172 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 140 + + + BICOMP + 579 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 256 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 723 + + + BICOMP + 651 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 269 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 555 + + + BICOMP + 423 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 725 + + + BICOMP + 768 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 100 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 576 + + + BICOMP + 591 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 624 + + + BICOMP + 444 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 531 + + + BICOMP + 716 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 759 + + + BICOMP + 476 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 722 + + + BICOMP + 163 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 70 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 480 + + + BICOMP + 115 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 223 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 631 + + + BICOMP + 738 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 629 + + + BICOMP + 551 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 70 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 547 + + + BICOMP + 145 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 70 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 605 + + + BICOMP + 610 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 70 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 552 + + + BICOMP + 167 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 70 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 682 + + + BICOMP + 154 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 76 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 600 + + + BICOMP + 536 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 76 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 598 + + + BICOMP + 659 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 621 + + + BICOMP + 812 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 97 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 602 + + + BICOMP + 412 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 97 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 645 + + + BICOMP + 603 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 100 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 641 + + + BICOMP + 784 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 97 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 599 + + + BICOMP + 302 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 528 + + + BICOMP + 701 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 76 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 150 + + + BICOMP + 532 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 70 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 70 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 653 + + + BICOMP + 332 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 76 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 323 + + + BICOMP + 303 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 76 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 635 + + + BICOMP + 554 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 97 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 580 + + + BICOMP + 713 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 100 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 113 + + + BICOMP + 590 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 269 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 269 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 136 + + + BICOMP + 712 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 97 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 604 + + + BICOMP + 525 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 76 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 76 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 545 + + + BICOMP + 505 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 97 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 97 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 770 + + + BICOMP + 307 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 421 + + + BICOMP + 756 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 817 + + + BICOMP + 740 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 62 218 475 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 776 + + + BICOMP + 518 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 766 + + + BICOMP + 749 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 802 + + + BICOMP + 404 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 419 + + + BICOMP + 500 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 656 + + + BICOMP + 669 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 592 + + + BICOMP + 499 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 490 + + + BICOMP + 557 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 318 + + + BICOMP + 126 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 458 + + + BICOMP + 428 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 502 + + + BICOMP + 473 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 618 + + + BICOMP + 681 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 625 + + + BICOMP + 537 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 449 + + + BICOMP + 613 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 487 + + + BICOMP + 687 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 752 + + + BICOMP + 482 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 560 + + + BICOMP + 561 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 100 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 570 + + + BICOMP + 807 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 174 + + + BICOMP + 796 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 793 + + + BICOMP + 131 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 207 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 455 + + + BICOMP + 430 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 585 + + + BICOMP + 811 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 633 + + + BICOMP + 492 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 715 + + + BICOMP + 685 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 256 223 210 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 663 + + + BICOMP + 771 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 159 + + + BICOMP + 737 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 256 223 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 256 223 210 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 328 + + + BICOMP + 647 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 256 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 256 207 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 454 + + + BICOMP + 615 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + BICOMP + 729 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 448 + + + BICOMP + 390 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 210 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 210 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 465 + + + BICOMP + 616 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 374 + + + BICOMP + 460 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 384 + + + BICOMP + 728 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 223 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 223 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 611 + + + BICOMP + 652 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 100 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 100 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 141 + + + BICOMP + 711 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 207 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 755 + + + BICOMP + 577 + + + + + ICCARM + 62 218 456 529 524 440 410 507 726 521 735 567 720 94 223 256 207 + + + BICOMP + 62 218 456 529 524 440 410 507 732 718 726 735 567 720 94 223 256 207 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 62 218 558 533 498 710 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 62 218 533 710 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 62 218 533 710 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 62 218 780 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 62 218 710 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 62 218 558 533 498 800 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 62 218 533 558 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 62 218 475 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 62 218 800 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 62 218 533 498 558 739 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 62 218 780 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 62 218 558 533 498 475 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 62 218 710 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 62 218 498 533 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 62 218 558 533 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 62 218 558 533 498 475 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 62 218 558 533 498 780 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 62 218 558 533 498 406 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 62 218 800 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 62 218 498 533 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 62 218 533 406 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 62 218 558 533 498 780 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 62 218 739 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 62 218 533 800 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 62 218 533 739 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 62 218 533 498 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 62 218 558 533 498 780 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 62 218 558 533 498 710 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 62 218 533 498 780 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 62 218 558 533 498 739 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 775 516 721 152 790 566 321 129 509 445 637 779 313 563 677 538 626 330 688 128 402 457 488 522 628 745 607 792 601 398 584 142 394 380 424 852 642 743 650 634 472 447 803 684 785 562 301 541 385 443 620 310 132 311 627 787 546 754 324 139 429 434 699 438 702 706 666 804 319 762 617 731 757 733 416 636 704 763 696 486 765 379 822 589 655 526 578 797 408 431 144 513 548 436 786 511 519 166 809 758 134 474 649 661 556 643 539 772 114 723 781 673 160 123 761 657 452 427 609 680 125 632 140 777 569 481 471 514 689 555 439 670 468 527 531 598 480 759 624 599 113 631 629 547 722 605 552 150 682 528 604 653 600 323 621 635 602 545 136 641 580 725 645 576 611 560 715 570 174 159 592 448 490 487 454 752 755 328 793 141 455 502 549 585 656 318 633 663 465 618 625 458 449 374 384 766 770 776 802 419 421 817 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 62 218 800 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 62 218 533 558 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 62 218 533 475 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 62 218 475 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 62 218 533 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 62 218 533 498 739 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 62 218 533 780 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 62 218 533 498 710 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 62 218 533 498 800 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 62 218 406 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 62 218 533 498 406 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 62 218 498 533 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 62 218 533 498 475 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 62 218 558 533 498 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 62 218 498 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 62 218 558 533 498 739 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 817 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 776 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 419 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 802 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 625 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 458 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 449 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 766 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 421 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 384 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 770 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 374 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 519 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + AARM + 486 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 569 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 526 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 733 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + AARM + 765 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 757 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 797 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 655 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 408 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 539 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 578 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + AARM + 763 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 160 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 142 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 894 + + + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + AARM + 696 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 134 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 743 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 902 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 457 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 398 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 584 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 745 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 394 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 904 898 896 901 914 899 894 912 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 642 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 792 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 607 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 424 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 650 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 472 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 447 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 803 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 785 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 634 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 684 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 402 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 601 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 380 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 488 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 301 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 385 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 628 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 541 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 443 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 522 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 899 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 852 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 562 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 894 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 128 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 688 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 637 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 677 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 566 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 779 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 538 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 626 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 152 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 330 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 790 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 516 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 721 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 321 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 129 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 509 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 445 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 313 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 563 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 900 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 775 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 912 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 511 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 904 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 556 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 809 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 643 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 114 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 609 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 125 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 471 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 548 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 123 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 632 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 140 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 758 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 166 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 657 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 514 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 786 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 649 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 661 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 772 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 474 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 723 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 898 902 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 761 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 452 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 673 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 427 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 680 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 777 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 781 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 481 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 436 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 896 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 617 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 513 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 416 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 904 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 666 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 139 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 434 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 731 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 706 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 546 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 438 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 699 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 636 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 620 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 311 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 627 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 804 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 704 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 822 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 319 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 702 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 589 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 904 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 431 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 429 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 787 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 762 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 901 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 132 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 379 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 310 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 754 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 144 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 898 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 324 + + + + + ICCARM + 897 855 456 529 524 440 410 507 726 521 735 567 720 853 854 902 898 914 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_a9/iar/example_build/tx.ewd b/ports/cortex_a9/iar/example_build/tx.ewd new file mode 100644 index 00000000..897111f4 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_a9/iar/example_build/tx.ewp b/ports/cortex_a9/iar/example_build/tx.ewp new file mode 100644 index 00000000..c5732045 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.ewp @@ -0,0 +1,2766 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a9/iar/example_build/tx.ewt b/ports/cortex_a9/iar/example_build/tx.ewt new file mode 100644 index 00000000..2149bed8 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx.ewt @@ -0,0 +1,3427 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_context_save.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_fiq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_a9/iar/example_build/tx_initialize_low_level.s b/ports/cortex_a9/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..e9a16771 --- /dev/null +++ b/ports/cortex_a9/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,327 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; Disable irq,fiq SVC mode +IRQ_MODE DEFINE 0xD2 ; Disable irq,fiq IRQ mode +FIQ_MODE DEFINE 0xD1 ; Disable irq,fiq FIQ mode +SYS_MODE DEFINE 0xDF ; Disable irq,fiq SYS mode +; +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + EXTERN _tx_thread_fiq_context_save + EXTERN _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + EXTERN _tx_thread_fiq_nesting_start + EXTERN _tx_thread_fiq_nesting_end +#endif + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + CODE32 + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r3 ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; +#else + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +#endif +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_a9/iar/inc/tx_port.h b/ports/cortex_a9/iar/inc/tx_port.h new file mode 100644 index 00000000..4d6d1537 --- /dev/null +++ b/ports/cortex_a9/iar/inc/tx_port.h @@ -0,0 +1,398 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-A9/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-A9. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-A9/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_a9/iar/readme_threadx.txt b/ports/cortex_a9/iar/readme_threadx.txt new file mode 100644 index 00000000..f2221ee0 --- /dev/null +++ b/ports/cortex_a9/iar/readme_threadx.txt @@ -0,0 +1,544 @@ + Microsoft's Azure RTOS ThreadX for Cortex-A9 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-A9 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-A9 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-A9 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + + TX_ENABLE_FIQ_SUPPORT This assembler/compiler define enables + FIQ interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + TX_THUMB Defined, this option enables the BX LR calling return sequence + in assembly files, to ensure correct operation on systems that + use both ARM and Thumb mode. By default, this option is + not defined + + + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-A9 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-A9 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-A9 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no +longer required, calling the _tx_thread_fiq_nesting_end service disables +nesting by disabling FIQ interrupts and switching back to FIQ mode in +preparation for the FIQ context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ dispatch call goes here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-A9 Mixed Mode + +By default, ThreadX is setup for running in Cortex-A9 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. In addition, if any Thumb code is used the entire +ThreadX assembly source should be built with TX_THUMB defined. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +11. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + + + +12. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-A9 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_a9/iar/src/tx_iar.c b/ports/cortex_a9/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_a9/iar/src/tx_thread_context_restore.s b/ports/cortex_a9/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..fbdffc78 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_context_restore.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +SVC_MODE DEFINE 0xD3 ; SVC mode +IRQ_MODE DEFINE 0xD2 ; IRQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + CODE32 +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_context_save.s b/ports/cortex_a9/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..63f4792a --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_context_save.s @@ -0,0 +1,210 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + CODE32 +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s b/ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..566dcd15 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,270 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0xD3 ; SVC mode +FIQ_MODE DEFINE 0xD1 ; FIQ mode +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +THUMB_MASK DEFINE 0x20 ; Thumb bit mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +SVC_MODE_BITS DEFINE 0x13 ; SVC mode value + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_restore + CODE32 +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + MRS r3, CPSR ; Pickup current CPSR + ORR r0, r3, #DISABLE_INTS ; Build interrupt disable value + MSR CPSR_cxsf, r0 ; Lockout interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_cxsf, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_cxsf, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block */ + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MRS r3, CPSR ; Pickup current CPSR + BIC r3, r3, #MODE_MASK ; Clear the mode portion of the CPSR + ORR r3, r3, #SVC_MODE_BITS ; Or-in new interrupt lockout bit + MSR CPSR_cxsf, r3 ; Lockout interrupts + B _tx_thread_schedule ; Return to scheduler +; +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s b/ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..c60ea9a4 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_fiq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_context_save + CODE32 +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..15350c38 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,109 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +FIQ_MODE_BITS DEFINE 0x11 ; FIQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_end + CODE32 +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..75cb6a98 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +FIQ_DISABLE DEFINE 0x40 ; FIQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_fiq_nesting_start + CODE32 +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_interrupt_control.s b/ports/cortex_a9/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..4ad92728 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,103 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +INT_MASK DEFINE 0xC0 ; Interrupt bit mask +#else +INT_MASK DEFINE 0x80 ; Interrupt bit mask +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + CODE32 +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; +; + END diff --git a/ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..31680cbb --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + CODE32 +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + ORR r1, r0, #DISABLE_INTS ; Mask interrupts + MSR CPSR_cxsf, r1 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; +; + END diff --git a/ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..78eeeb68 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + CODE32 +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} +; + END diff --git a/ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..cb0976d2 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; Disable IRQ & FIQ interrupts +#else +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +#endif +MODE_MASK DEFINE 0x1F ; Mode mask +IRQ_MODE_BITS DEFINE 0x12 ; IRQ mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + CODE32 +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_cxsf, r0 ; Disable interrupts + LDR lr, [sp] ; Pickup saved lr + ADD sp, sp, #4 ; Adjust stack pointer + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_cxsf, r0 ; Re-enter IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..512ef7f2 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_DISABLE DEFINE 0x80 ; IRQ disable bit +MODE_MASK DEFINE 0x1F ; Mode mask +SYS_MODE_BITS DEFINE 0x1F ; System mode bits +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s79). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + CODE32 +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + STR lr, [sp, #-4]! ; Push the system mode lr on the system mode stack + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_cxsf, r0 ; Enter system mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_schedule.s b/ports/cortex_a9/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..4c8eabbf --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_schedule.s @@ -0,0 +1,240 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +ENABLE_INTS DEFINE 0xC0 ; IRQ & FIQ Interrupts enabled mask +#else +ENABLE_INTS DEFINE 0x80 ; IRQ Interrupts enabled mask +#endif +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + CODE32 +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + MRS r2, CPSR ; Pickup CPSR + BIC r0, r2, #ENABLE_INTS ; Clear the disable bit(s) + MSR CPSR_cxsf, r0 ; Enable interrupts +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + MSR CPSR_cxsf, r2 ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + VLDMIA sp!, {D16-D31} ; Recover D16-D31 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts +#else + CPSID i ; Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts +#else + CPSID i ; Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_stack_build.s b/ports/cortex_a9/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..04876d27 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_stack_build.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK DEFINE 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled +#else +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +#endif +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + CODE32 +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-A9 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure long-word alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +;} + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_system_return.s b/ports/cortex_a9/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..2e4e661d --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_system_return.s @@ -0,0 +1,166 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + CODE32 +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts +#else + CPSID i ; Disable IRQ interrupts +#endif +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D16-D31} ; Save D16-D31 + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..54bf3ea3 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,195 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS DEFINE 0xC0 ; IRQ & FIQ interrupts disabled +#else +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +#endif + + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + CODE32 +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; +#ifdef TX_ENABLE_FIQ_SUPPORT + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt CPSR + MSR CPSR_cxsf, r0 ; Disable interrupts +#endif + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + MOV pc, lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_a9/iar/src/tx_timer_interrupt.s b/ports/cortex_a9/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..629a76c5 --- /dev/null +++ b/ports/cortex_a9/iar/src/tx_timer_interrupt.s @@ -0,0 +1,260 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-A9/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + CODE32 +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; +#ifdef TX_THUMB + BX lr ; Return to caller +#else + MOV pc, lr ; Return to caller +#endif +; +;} + END + diff --git a/ports/cortex_m0/ac5/example_build/build_threadx.bat b/ports/cortex_m0/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..8018092d --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m0 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m0 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_block_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_pool_search.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_byte_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_set.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_initialize_high_level.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_priority_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_mutex_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_flush.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_front_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_receive.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_queue_send_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_identify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_preemption_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_priority_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_relinquish.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_reset.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_resume.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_shell_entry.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_sleep.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_suspend.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_system_resume.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_system_suspend.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_terminate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_time_slice.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_timeout.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_thread_wait_abort.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_time_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_time_set.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_activate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_deactivate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_expiration_process.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_system_activate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_timer_thread_entry.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_enable.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_event_filter.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_disable.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_initialize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_object_register.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_object_unregister.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_block_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_allocate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_byte_release.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_set.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_mutex_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_flush.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_front_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_receive.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_send.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_queue_send_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_put.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_info_get.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_preemption_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_priority_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_relinquish.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_reset.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_resume.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_suspend.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_terminate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_thread_wait_abort.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_activate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_change.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_create.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_deactivate.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_delete.c +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m0/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m0/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..a213bc79 --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m0 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m0 -I../inc -I../../../../common/inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m0/ac5/example_build/sample_threadx.c b/ports/cortex_m0/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..4d95c2ed --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..61c57b5f --- /dev/null +++ b/ports/cortex_m0/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,284 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + LDR R0, =__main + BX R0 + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADDS r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + LDR r0, =0xE000ED08 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; MOVS r2, #1 +; ORRS r1, r1, r2 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD08 ; Offset to vector base register + ADD r0, r0, r2 ; Build vector base register + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOVS r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD18 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD1C ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD20 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + STACK_SIZE) + LDR R2, =(HeapMem + HEAP_SIZE) + LDR R3, =StackMem + BX LR +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, r1} + MOV lr, r1 + BX lr +; } + + EXPORT SysTick_Handler + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +SysTick_Handler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, r1} + MOV lr, r1 + BX lr +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + + diff --git a/ports/cortex_m0/ac5/inc/tx_port.h b/ports/cortex_m0/ac5/inc/tx_port.h new file mode 100644 index 00000000..31bb6d4d --- /dev/null +++ b/ports/cortex_m0/ac5/inc/tx_port.h @@ -0,0 +1,335 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M0/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M0 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M0/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m0/ac5/readme_threadx.txt b/ports/cortex_m0/ac5/readme_threadx.txt new file mode 100644 index 00000000..fb2f95c3 --- /dev/null +++ b/ports/cortex_m0/ac5/readme_threadx.txt @@ -0,0 +1,143 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M0 + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +development environment. At this point you may run the build_threadx.bat batch +file. This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M0 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M0 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r8 + 0x04 r9 + 0x08 r10 + 0x0C r11 + 0x10 r4 + 0x14 r5 + 0x18 r6 + 0x1C r7 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M0 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M0 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, r1} + MOV lr, r1 + BX lr + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M0 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m0/ac5/src/tx_thread_context_restore.s b/ports/cortex_m0/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..4ef66308 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Preemption has already been addressed - just return! */ +; + POP {r0} + MOV lr, r0 + BX lr +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_context_save.s b/ports/cortex_m0/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..52fd2828 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_context_save.s @@ -0,0 +1,101 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, r1} ; Recover ISR lr + MOV lr, r1 + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..7b360417 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b28496d6 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..29d0f590 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m0/ac5/src/tx_thread_schedule.s b/ports/cortex_m0/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..abcb7c2c --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_schedule.s @@ -0,0 +1,278 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M0 +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOVS r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load ICSR address + STR r0, [r1] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switch-out switch-in handler... Note that this handler is +; common for both PendSV and SVCall. */ +; + EXPORT PendSV_Handler + EXPORT __tx_PendSVHandler +PendSV_Handler +__tx_PendSVHandler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, r1} ; Recover LR + MOV lr, r1 ; + CPSIE i ; Enable interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + MOVS r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CMP r1,#0 ; If NULL, skip preservation + BEQ __tx_ts_new ; +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r3, PSP ; Pickup PSP pointer (thread's stack pointer) + SUBS r3, r3, #16 ; Allocate stack space + STM r3!, {r4-r7} ; Save its remaining registers (M3 Instruction: STMDB r12!, {r4-r11}) + MOV r4,r8 ; + MOV r5,r9 ; + MOV r6,r10 ; + MOV r7,r11 ; + SUBS r3, r3, #32 ; Allocate stack space + STM r3!, {r4-r7} ; + SUBS r3, r3, #20 ; Allocate stack space + MOV r5, LR ; + STR r5, [r3] ; Save LR on the stack + STR r3, [r1, #8] ; Save its stack pointer +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r4] ; Pickup current time-slice + CMP r5, #0 ; If not active, skip processing + BEQ __tx_ts_new ; +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + MOVS r5, #0 ; Build clear value + STR r5, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CMP r1, #0 ; + BEQ __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADDS r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r0/r1 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r3, [r1, #8] ; Pickup thread's stack pointer + LDR r5, [r3] ; Recover saved LR + ADDS r3, r3, #4 ; Position past LR + MOV lr, r5 ; Restore LR + LDM r3!,{r4-r7} ; Recover thread's registers (r4-r11) + MOV r11,r7 ; + MOV r10,r6 ; + MOV r9,r5 ; + MOV r8,r4 ; + LDM r3!,{r4-r7} ; + MSR PSP, r3 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CMP r1, #0 ; If non-NULL, a new thread is ready! + BNE __tx_ts_ready ; + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF +__tx_ts_ISB + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + LDR r7, =0x08000000 ; Build clear PendSV value + LDR r5, =0xE000ED04 ; Build base NVIC address + STR r7, [r5] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_stack_build.s b/ports/cortex_m0/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..524eb9f5 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,146 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M0 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + MOVS r3, #0x7 ; + BICS r2, r2, r3 ; Align frame for 8-byte alignment + SUBS r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOVS r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r8 + STR r3, [r2, #8] ; Store initial r9 + STR r3, [r2, #12] ; Store initial r10 + STR r3, [r2, #16] ; Store initial r11 + STR r3, [r2, #20] ; Store initial r4 + STR r3, [r2, #24] ; Store initial r5 + STR r3, [r2, #28] ; Store initial r6 + STR r3, [r2, #32] ; Store initial r7 +; +; /* Hardware stack follows. */ +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + LDR r3, =0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + LDR r3, =0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/ac5/src/tx_thread_system_return.s b/ports/cortex_m0/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..a1e11054 --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_thread_system_return.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load NVIC base + STR r0, [r1] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller + NOP +;} + END + diff --git a/ports/cortex_m0/ac5/src/tx_timer_interrupt.s b/ports/cortex_m0/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d5844d9c --- /dev/null +++ b/ports/cortex_m0/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,274 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_preempt_disable +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M0/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADDS r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUBS r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOVS r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOVS r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADDS r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + PUSH {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); +; + BL _tx_thread_time_slice ; Call time-slice processing + LDR r0, =_tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CMP r1, #0 ; + BNE __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + LDR r0, =0xE000ED04 ; Build address of control register + LDR r2, =0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + POP {r0, r1} ; Recover lr register (r0 is just there for + MOV lr, r1 ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m0/gnu/example_build/build_threadx.bat b/ports/cortex_m0/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..c74b194e --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m0/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m0/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..96c754d5 --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb tx_vectors.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb cortexm0_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m0 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m0 -ereset_handler -T sample_threadx.ld tx_vectors.o cortexm0_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m0/gnu/example_build/cortexm0_crt0.s b/ports/cortex_m0/gnu/example_build/cortexm0_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/cortexm0_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m0/gnu/example_build/libgcc.a b/ports/cortex_m0/gnu/example_build/libgcc.a new file mode 100644 index 00000000..cdfd02e3 Binary files /dev/null and b/ports/cortex_m0/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_m0/gnu/example_build/sample_threadx.c b/ports/cortex_m0/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..f400736a --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/sample_threadx.c @@ -0,0 +1,372 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 12000 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", &memory_area[0], DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m0/gnu/example_build/sample_threadx.ld b/ports/cortex_m0/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m0/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m0/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m0/gnu/example_build/tx_initialize_low_level.S old mode 100755 new mode 100644 similarity index 100% rename from ports/cortex_m0/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m0/gnu/example_build/tx_initialize_low_level.S diff --git a/ports/cortex_m0/gnu/src/tx_vector_table_sample.S b/ports/cortex_m0/gnu/example_build/tx_vectors.s similarity index 100% rename from ports/cortex_m0/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m0/gnu/example_build/tx_vectors.s diff --git a/ports/cortex_m0/gnu/readme_threadx.txt b/ports/cortex_m0/gnu/readme_threadx.txt new file mode 100644 index 00000000..3dd7fbf1 --- /dev/null +++ b/ports/cortex_m0/gnu/readme_threadx.txt @@ -0,0 +1,155 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M0 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M0 + +The ThreadX demonstration is designed to execute on Cortex-M0 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M0 using gnu tools uses the standard GNU +Cortex-M0 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M0 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r8 + 0x04 r9 + 0x08 r10 + 0x0C r11 + 0x10 r4 + 0x14 r5 + 0x18 r6 + 0x1C r7 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M0 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M0 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +ISRs can be written completely in C (or assembly language) without any calls to +_tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed access to the +ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + + .global your_assembly_isr + .thumb_func +your_assembly_isr: +; VOID your_assembly_isr(VOID) +; { + PUSH {r0, lr} +; +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, r1} + MOV lr, r1 + BX lr +; } + + +Note: the Cortex-M0 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M0 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m0/gnu/src/tx_thread_stack_build.S b/ports/cortex_m0/gnu/src/tx_thread_stack_build.S index ca66e1d5..85dbba6f 100755 --- a/ports/cortex_m0/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m0/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M0/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -85,14 +90,14 @@ _tx_thread_stack_build: @ @ Stack Top: @ LR Interrupted LR (LR at time of PENDSV) +@ r8 Initial value for r8 +@ r9 Initial value for r9 +@ r10 Initial value for r10 +@ r11 Initial value for r11 @ r4 Initial value for r4 @ r5 Initial value for r5 @ r6 Initial value for r6 @ r7 Initial value for r7 -@ r8 Initial value for r8 -@ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) -@ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @ r2 Initial value for r2 @@ -114,16 +119,14 @@ _tx_thread_stack_build: @ /* Actually build the stack frame. */ @ MOVS r3, #0 @ Build initial register value - STR r3, [r2, #4] @ Store initial r4 - STR r3, [r2, #8] @ Store initial r5 - STR r3, [r2, #12] @ Store initial r6 - STR r3, [r2, #16] @ Store initial r7 - STR r3, [r2, #20] @ Store initial r8 - STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOVS r3, #0 @ Build initial register value - STR r3, [r2, #32] @ Store initial r11 + STR r3, [r2, #4] @ Store initial r8 + STR r3, [r2, #8] @ Store initial r9 + STR r3, [r2, #12] @ Store initial r10 + STR r3, [r2, #16] @ Store initial r11 + STR r3, [r2, #20] @ Store initial r4 + STR r3, [r2, #24] @ Store initial r5 + STR r3, [r2, #28] @ Store initial r6 + STR r3, [r2, #32] @ Store initial r7 @ @ /* Hardware stack follows. */ @ diff --git a/ports/cortex_m0/iar/example_build/azure_rtos.eww b/ports/cortex_m0/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m0/iar/example_build/cstartup_M.s b/ports/cortex_m0/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..a498443c --- /dev/null +++ b/ports/cortex_m0/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(2) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + LDR r0, =__iar_program_start + BX r0 + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.c b/ports/cortex_m0/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..95ff3a47 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.c @@ -0,0 +1,385 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define event buffer. */ + +#ifdef TX_ENABLE_EVENT_TRACE +UCHAR trace_buffer[0x10000]; +#endif + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer; + + +#ifdef TX_ENABLE_EVENT_TRACE + tx_trace_enable(trace_buffer, sizeof(trace_buffer), 32); +#endif + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.dep b/ports/cortex_m0/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..1b9970a4 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.dep @@ -0,0 +1,118 @@ + + + 4 + 90173316 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\tx_initialize_low_level.s + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\lib\rt6M_tl.a + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\lib\dl6M_tln.a + $TOOLKIT_DIR$\lib\m6M_tl.a + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + + + [ROOT_NODE] + + + ILINK + 7 21 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 10 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 13 + + + __cstat + 16 + + + BICOMP + 31 + + + + + ICCARM + 19 24 25 27 20 26 4 22 28 8 23 14 11 12 17 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 6 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 21 + + + + + ILINK + 15 10 13 5 6 18 9 30 29 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.ewd b/ports/cortex_m0/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..8f258489 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.ewp b/ports/cortex_m0/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..a1aaca18 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2127 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.ewt b/ports/cortex_m0/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..24445b46 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m0/iar/example_build/sample_threadx.icf b/ports/cortex_m0/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..6e644f92 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/sample_threadx.icf @@ -0,0 +1,33 @@ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..40cac5c7 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 310 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 01000000100040E100000100000013860000D0000000259600000100000010860000830000000C810000120000000486000001000000249600000100000017810000010000000E8100000100000003E100000F0000000B81000001000000118600003400000046810000090000000D810000030000000886000001000000E880000002000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000038040000000A000065050000 + 0000000021040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000039040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000007E0100001D040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF7E01000032000000820100001D0400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000001D040000000A000021040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000038040000000A0000650500000000000021040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..4fed2f46 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..1fadebf4 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..a7aa9bbc --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M0" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..aa4f02d3 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m0\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m0/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..26d198e0 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1940 @@ + + + + + + + 3 + 0 + 0 + + + 20 + 1725 + + + 20 + 1293 + 345 + 86 + + 3 + 0 + 0 + + + Debug-Log + + + + + + + 504 + 27 + 27 + 27 + + + 1 + 0 + 0 + + + SourceBrowser + + + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + Disassembly + _I0 + + + 500 + 20 + + + 0 + 0 + + + + + + + + 187 + 100 + 100 + 100 + + + + 1 + 0 + 0 + + + Workspace + + + + + + + 3 + 0 + 0 + + + 1 + 0 + + + + 3 + 0 + 0 + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BLOCKPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-TIMER + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-EVENTFLAG + + + + + + + 3 + 0 + 0 + + + TX-THREAD + + + TX-MESSAGEQUEUE + + + TX-SEMAPHORE + + + TX-MUTEX + + + TX-BYTEPOOL + + + TX-BLOCKPOOL + + + TX-TIMER + + + + + + + + + + TabID-5317-31676 + Register + Register + + 0 + 0 + 0 + 2 + EPSR + IPSR + + + + 0 + + + + + + TabID-10838-10193 + Disassembly + Disassembly + + + + 0 + + + + + TabID-9777-11423 + Thread List + TX-THREAD + + 1 + + + + 0 + + + + + TabID-4319-11730 + Debug Log + Debug-Log + + + + TabID-28996-20478 + Breakpoints + Breakpoints + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 48 + 1775 + 1775 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + + + + + + -2 + -2 + 452 + 276 + -2 + -2 + 208 + 203 + 137022 + 219222 + 183136 + 490281 + + + + + + + + + + + + -2 + 274 + 452 + 691 + 274 + -2 + 173 + 182 + 113966 + 196544 + 274704 + 490281 + + + + + + + + + + + -2 + -2 + 201 + 1520 + -2 + -2 + 1522 + 203 + 1002635 + 219222 + 113966 + 196544 + + + + + + + + + 199 + -2 + 381 + 1520 + -2 + 199 + 1522 + 182 + 1002635 + 196544 + 113966 + 196544 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + Access + Current CPU Registers + Value + + + 180 + 180 + 180 + + + 0 + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + BA0100001000259600000100000013860000D000000040E100000100000010860000830000000C8100001200000004860000010000001781000001000000249600000100000003E100000F0000000E810000030000000B810000010000001186000034000000468100000900000008860000010000000D81000003000000E880000002000000 + + + 0F00FFFFFFFF83860000588600007486000000DC000001DC000002DC000003DC0000439200001E920000289200002992000024960000259600001F960000 + 2900138600002F000000578600001800000059920000240000007686000039000000108600002D000000848600003A00000023920000000000000A8600002B0000001D920000130000000786000028000000008D00001E000000048600002500000056860000330000009A86000016000000259200001B000000008400007600000044920000220000001F9200001F0000005E86000035000000098600002A0000001A860000320000002D9200002100000006860000270000008E8600003B000000148600003000000069860000380000002396000087000000118600002E000000558600000600000046810000600000000E8600001700000060860000370000000B8600002C0000005D860000340000000886000029000000C386000003000000A18600003C0000002C9200002000000005860000260000001686000031000000C08600000A000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000006300000006010000B1040000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + 020800004C00000024090000FC000000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34065 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34067 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34101 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34113 + 020800004C00000024090000FC000000 + 04000000B6040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 020800004C000000820A0000DC000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 020800004C000000B0090000DC000000 + 040000003C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 020800004C00000024090000FC000000 + 0000000038020000A4060000B4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 020800004C00000008090000AC010000 + E404000032000000A4060000B4020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34083 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + 020800004C00000008090000AC010000 + 040000004A000000020100009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + 020800004C00000008090000AC010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34105 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 020800004C00000024090000FC000000 + 0A01000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + 020800004C00000024090000FC000000 + 0A010000EA030000000A00009A040000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + 020800004C00000008090000AC010000 + 690800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 166 + 150 + 100 + 100 + + + + 34119 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000001000000FFFFFFFFFFFFFFFF650800004C000000690800009A0400000100000002000010040000000100000075FBFFFFB5000000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000E6030000000A0000EA030000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000000020000A406000004020000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004A850000FFFF02000B004354616262656450616E650010000001000000000000006300000006010000B1040000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004A85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4A85000001000000FFFFFFFF4A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFFE004000032000000E4040000B40200000000000002000000040000000100000075FBFFFFB5000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF00000000F0010000A4060000F4010000000000000100000004000000010000000000000000000000FFFFFFFF040000001B8500001C8500001D8500001E85000001800080000000000000000000000B020000A4060000CB02000000000000F4010000A4060000B4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001E85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1B85000001000000FFFFFFFF1B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000080000000000000FFFFFFFFFFFFFFFF0000000020020000A406000024020000000000000100000004000000010000000000000000000000FFFFFFFF010000002085000001800080000000000000000000003B020000A4060000CB0200000000000024020000A4060000B4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002085000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2085000001000000FFFFFFFF20850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000F85000011850000128500001385000035850000418500000180008000000100000000000000B5040000000A000065050000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003585000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004185000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + E40300001A0000002904000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000063000000FFFEFF000000000000000000000000000100000001000000018001E100000000000064000000FFFEFF000000000000000000000000000100000001000000018003E100000000000066000000FFFEFF0000000000000000000000000001000000010000000180008100000000000047000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000000069000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000000070000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005A000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006C000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018029E10000000000006F000000FFFEFF0000000000000000000000000001000000010000000180028100000000000049000000FFFEFF000000000000000000000000000100000001000000018029810000000000005E000000FFFEFF000000000000000000000000000100000001000000018027810000000000005C000000FFFEFF000000000000000000000000000100000001000000018028810000000000005D000000FFFEFF00000000000000000000000000010000000100000001801D8100000000000056000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040057000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000000004D000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004E000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000062000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000058000000FFFEFF0000000000000000000000000001000000010000000180208100000000000059000000FFFEFF0000000000000000000000000001000000010000000180468100000000020060000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34127 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34123 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..e84a61e9 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,100 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 98018242 + + + 0 + 0 + 0 + + + 1 + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups b/ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/sample_threadx.reggroups @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..a7aa9bbc --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M0" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.crun b/ports/cortex_m0/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.dbgdt b/ports/cortex_m0/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m0/iar/example_build/settings/tx.dnx b/ports/cortex_m0/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_m0/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m0/iar/example_build/tx.dep b/ports/cortex_m0/iar/example_build/tx.dep new file mode 100644 index 00000000..f75ac03e --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.dep @@ -0,0 +1,11975 @@ + + + 4 + 3548978476 + + Debug + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_queue_delete.c + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + + + [ROOT_NODE] + + + IARCHIVE + 981 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 1056 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 727 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 756 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 785 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 956 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_release.c + + + ICCARM + 14 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 544 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 1144 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 751 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 534 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 265 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 756 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 751 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 982 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 820 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 1148 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 610 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 1005 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 1144 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 1128 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 17 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 869 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 790 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 680 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 876 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 866 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 980 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 785 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 897 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 544 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 917 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 731 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 14 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 18 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 1056 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 956 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 727 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 534 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 1163 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 960 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 471 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 59 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 689 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 786 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 715 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 772 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 903 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 1153 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 966 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 1018 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 92 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 379 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 961 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 887 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 851 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 1009 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 778 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 758 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 337 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 870 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 1037 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 1159 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 762 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 3 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 456 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 973 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 373 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 855 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 4 86 73 1 0 3 5 6 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 945 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 19 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 459 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 1176 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 796 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 807 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 342 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 628 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 867 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 1191 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 1095 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 518 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 1120 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 692 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 769 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 969 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 538 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 877 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 970 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 1035 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 549 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 4 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 803 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 627 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 682 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 1022 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 1010 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 58 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 691 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 962 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 4 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 675 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 1126 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 746 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 636 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 21 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 1 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 1084 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 1047 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 713 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 1057 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 581 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 29 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 750 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 939 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 795 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 971 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 745 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 711 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 806 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 720 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 732 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 733 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 1011 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 854 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 33 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 1038 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 957 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 699 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 685 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 1096 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 824 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 744 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 925 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 977 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 1048 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 1151 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 705 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 811 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 362 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 797 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 812 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 1002 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 1158 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 810 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 1050 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 716 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 1175 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 1118 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 748 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 704 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 845 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 734 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 1021 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 626 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 653 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 598 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 710 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 1058 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 622 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 775 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 1166 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 695 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 792 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 926 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 983 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 709 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 552 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 1034 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 712 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 816 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 0 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 814 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 774 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 1063 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 1030 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 374 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 714 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 618 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 823 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 1053 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 776 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 984 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 1073 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 364 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 826 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 916 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 968 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 1070 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 6 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 878 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 1165 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 365 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 1069 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 1040 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 948 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 382 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 564 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 1179 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 650 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 92 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 930 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 721 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 51 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 1162 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 6 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 1005 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 265 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 585 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 708 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 857 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 1018 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 67 297 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 666 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 1148 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 945 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 966 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 778 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 459 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 1128 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 472 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 1159 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 960 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 379 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 456 + + + __cstat + 1167 + + + BICOMP + 20 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 297 + + + BICOMP + 1093 1014 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 19 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 1009 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 762 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 321 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 987 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 825 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_misra.c + + + ICCARM + 870 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 67 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 449 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 86 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 1007 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 809 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 4 86 73 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 928 + + + + + ICCARM + 2 7 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 73 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 982 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 917 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 887 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 1163 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 758 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 876 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 903 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 980 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 869 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 17 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 731 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 786 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 855 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 296 291 311 41 313 321 297 260 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 471 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 820 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 610 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 955 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 897 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 18 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 59 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 790 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 866 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 689 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 772 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 680 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 745 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 716 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 769 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 1058 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 1165 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 750 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 1175 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 365 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 926 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 1034 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 792 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 552 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 721 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 816 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 704 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 720 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 733 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 1069 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 321 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 699 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 854 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 803 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 734 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 1050 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 1002 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 806 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 795 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 713 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_time_set.c + + + ICCARM + 1096 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 712 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 968 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 265 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 977 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 362 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 685 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 748 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 824 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 948 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 878 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_release.c + + + ICCARM + 1162 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 1040 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 51 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 321 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 812 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 382 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 1030 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 1021 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 709 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 1118 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 297 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 983 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 823 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 29 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 564 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 1158 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 41 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 916 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 626 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 711 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 957 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 618 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 1053 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 814 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 695 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 714 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 1063 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 374 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 260 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 797 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 297 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 33 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 851 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 373 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 877 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 973 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 636 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 962 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 296 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 1010 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 1037 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 1176 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 1126 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 682 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 961 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 1153 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 1022 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 58 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 518 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 21 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 807 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 675 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 628 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 705 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 1038 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 971 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 291 67 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 1191 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 746 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 744 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 1095 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 342 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 538 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 970 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 313 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 1084 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 581 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 1120 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 1047 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 549 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 296 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 1035 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 1048 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 796 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_time_get.c + + + ICCARM + 732 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 1011 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 692 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 969 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 311 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 627 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 337 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 715 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 313 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 939 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 691 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 41 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 1057 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 867 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 41 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 811 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 311 291 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 925 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 1179 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 364 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 774 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 650 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 1070 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 260 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 776 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 826 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 67 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 1073 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 265 + + + + + $PROJ_DIR$\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 1151 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 930 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 265 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 984 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 260 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 775 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 987 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 928 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 449 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 857 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 666 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 825 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 622 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 653 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 598 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 809 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 1166 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 472 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 1007 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 296 291 311 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 710 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 810 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 845 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 + + + + + $PROJ_DIR$\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 708 + + + + + ICCARM + 286 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 856 844 291 311 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 720 + + + __cstat + 35 + + + BICOMP + 1142 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 774 + + + __cstat + 380 + + + BICOMP + 455 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 951 + + + BICOMP + 951 317 1160 1164 668 997 755 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 939 + + + __cstat + 537 + + + BICOMP + 862 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 691 + + + __cstat + 533 + + + BICOMP + 1029 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 1048 + + + __cstat + 9 + + + BICOMP + 606 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 692 + + + __cstat + 881 + + + BICOMP + 728 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 + + + BICOMP + 1164 1183 668 317 1180 997 919 1152 1014 1160 1157 1182 1185 702 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 58 + + + __cstat + 621 + + + BICOMP + 853 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 891 + + + BICOMP + 317 752 1160 1164 997 891 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 618 + + + __cstat + 717 + + + BICOMP + 921 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 796 + + + __cstat + 672 + + + BICOMP + 1123 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 564 + + + __cstat + 28 + + + BICOMP + 1078 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1043 + + + BICOMP + 755 1014 1160 1164 997 668 1043 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 795 + + + __cstat + 324 + + + BICOMP + 821 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 1179 + + + __cstat + 652 + + + BICOMP + 326 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 317 1157 752 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 984 + + + __cstat + 354 + + + BICOMP + 873 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 317 1160 1164 951 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 962 + + + __cstat + 348 + + + BICOMP + 818 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1014 + + + BICOMP + 1182 1014 1152 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 733 + + + __cstat + 69 + + + BICOMP + 686 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 1126 + + + __cstat + 32 + + + BICOMP + 57 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 891 + + + BICOMP + 317 752 1160 1164 997 891 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 854 + + + __cstat + 556 + + + BICOMP + 1086 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 744 + + + __cstat + 27 + + + BICOMP + 658 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 973 + + + __cstat + 45 + + + BICOMP + 352 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 317 1164 1113 919 752 1183 702 997 668 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 1038 + + + __cstat + 13 + + + BICOMP + 760 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 668 + + + BICOMP + 668 317 1157 752 1185 1160 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 969 + + + __cstat + 847 + + + BICOMP + 331 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 21 + + + __cstat + 357 + + + BICOMP + 735 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 891 + + + BICOMP + 317 752 1160 1164 997 891 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 628 + + + __cstat + 596 + + + BICOMP + 822 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 930 + + + __cstat + 600 + + + BICOMP + 943 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1043 + + + BICOMP + 755 1014 1160 1164 997 668 1043 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 712 + + + __cstat + 603 + + + BICOMP + 638 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 1180 1113 317 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 816 + + + __cstat + 340 + + + BICOMP + 879 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 1011 + + + __cstat + 62 + + + BICOMP + 1024 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 1053 + + + __cstat + 61 + + + BICOMP + 613 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 1063 + + + __cstat + 335 + + + BICOMP + 800 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 714 + + + __cstat + 582 + + + BICOMP + 625 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 + + + BICOMP + 1160 1185 317 755 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 1040 + + + __cstat + 599 + + + BICOMP + 808 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 382 + + + __cstat + 346 + + + BICOMP + 781 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 823 + + + __cstat + 46 + + + BICOMP + 1025 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 650 + + + __cstat + 384 + + + BICOMP + 976 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 374 + + + __cstat + 611 + + + BICOMP + 643 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 951 + + + BICOMP + 1180 755 317 1164 1183 1014 1182 1152 997 668 951 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 685 + + + __cstat + 34 + + + BICOMP + 740 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 1157 997 755 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 1151 + + + __cstat + 49 + + + BICOMP + 339 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 957 + + + __cstat + 619 + + + BICOMP + 946 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 1162 + + + __cstat + 55 + + + BICOMP + 932 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 581 + + + __cstat + 12 + + + BICOMP + 706 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 755 + + + BICOMP + 755 1157 752 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 1120 + + + __cstat + 784 + + + BICOMP + 718 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 317 752 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 971 + + + __cstat + 641 + + + BICOMP + 1023 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 752 + + + BICOMP + 752 1157 755 1185 1160 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 769 + + + __cstat + 892 + + + BICOMP + 1081 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 317 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 970 + + + __cstat + 15 + + + BICOMP + 40 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1113 + + + BICOMP + 1152 317 1182 752 1164 1180 1183 997 1113 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 373 + + + __cstat + 571 + + + BICOMP + 617 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 699 + + + __cstat + 615 + + + BICOMP + 465 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 750 + + + __cstat + 345 + + + BICOMP + 649 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 317 1183 752 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 824 + + + __cstat + 602 + + + BICOMP + 723 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 33 + + + __cstat + 656 + + + BICOMP + 664 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 919 1164 997 755 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 746 + + + __cstat + 541 + + + BICOMP + 959 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 925 + + + __cstat + 517 + + + BICOMP + 1004 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 919 1164 755 1183 702 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 814 + + + __cstat + 662 + + + BICOMP + 898 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 811 + + + __cstat + 560 + + + BICOMP + 614 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 668 + + + BICOMP + 668 1157 752 317 1185 1160 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 626 + + + __cstat + 360 + + + BICOMP + 36 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 317 1160 1164 891 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 948 + + + __cstat + 363 + + + BICOMP + 770 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 317 1157 752 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 732 + + + __cstat + 70 + + + BICOMP + 871 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 919 1164 997 755 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 1037 + + + __cstat + 888 + + + BICOMP + 56 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 1191 + + + __cstat + 654 + + + BICOMP + 793 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 317 752 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 1022 + + + __cstat + 779 + + + BICOMP + 941 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 891 + + + BICOMP + 1180 317 1164 1183 668 1182 1152 997 891 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 867 + + + __cstat + 11 + + + BICOMP + 979 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 317 1152 891 1182 752 1164 1180 1183 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 807 + + + __cstat + 833 + + + BICOMP + 1169 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 518 + + + __cstat + 623 + + + BICOMP + 669 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 745 + + + __cstat + 329 + + + BICOMP + 940 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 549 + + + __cstat + 864 + + + BICOMP + 841 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1014 + + + BICOMP + 1182 1014 1152 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 705 + + + __cstat + 63 + + + BICOMP + 542 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 961 + + + __cstat + 835 + + + BICOMP + 1071 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 1095 + + + __cstat + 583 + + + BICOMP + 1161 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 682 + + + __cstat + 520 + + + BICOMP + 651 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 1096 + + + __cstat + 343 + + + BICOMP + 378 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 919 1164 997 755 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 1047 + + + __cstat + 39 + + + BICOMP + 529 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 317 1157 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 538 + + + __cstat + 381 + + + BICOMP + 23 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 1035 + + + __cstat + 605 + + + BICOMP + 944 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 806 + + + __cstat + 527 + + + BICOMP + 914 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 + + + BICOMP + 752 1160 1164 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 713 + + + __cstat + 30 + + + BICOMP + 601 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 755 + + + BICOMP + 702 1183 752 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 675 + + + __cstat + 584 + + + BICOMP + 753 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 1010 + + + __cstat + 550 + + + BICOMP + 1143 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 1153 + + + __cstat + 578 + + + BICOMP + 707 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 636 + + + __cstat + 514 + + + BICOMP + 804 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 891 + + + BICOMP + 1152 891 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 1050 + + + __cstat + 325 + + + BICOMP + 1064 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 1007 + + + __cstat + 473 + + + BICOMP + 985 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 317 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 845 + + + __cstat + 551 + + + BICOMP + 736 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 708 + + + __cstat + 371 + + + BICOMP + 1171 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 1157 997 755 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 666 + + + __cstat + 323 + + + BICOMP + 894 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 825 + + + __cstat + 559 + + + BICOMP + 937 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 653 + + + __cstat + 361 + + + BICOMP + 366 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 855 + + + __cstat + 620 + + + BICOMP + 694 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1014 668 755 891 1113 952 1093 951 1043 + + + BICOMP + 1164 891 951 919 752 668 952 317 1183 702 997 1014 755 1113 1093 1043 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 622 + + + __cstat + 367 + + + BICOMP + 1079 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 + + + BICOMP + 1160 1185 668 1157 997 755 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 778 + + + __cstat + 10 + + + BICOMP + 1138 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 1183 1093 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 756 + + + __cstat + 929 + + + BICOMP + 519 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 951 + + + BICOMP + 752 1160 1164 997 951 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 917 + + + __cstat + 920 + + + BICOMP + 789 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 952 + + + BICOMP + 1157 668 1185 1160 997 952 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 17 + + + __cstat + 900 + + + BICOMP + 846 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 951 + + + BICOMP + 1152 951 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 1005 + + + __cstat + 923 + + + BICOMP + 747 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1043 + + + BICOMP + 1043 1160 1164 752 317 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 1056 + + + __cstat + 1186 + + + BICOMP + 783 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1043 + + + BICOMP + 1043 1160 1164 752 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 1009 + + + __cstat + 683 + + + BICOMP + 475 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1093 + + + BICOMP + 317 1157 668 1185 1160 997 1093 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 790 18 756 866 956 980 897 785 17 14 869 680 751 1056 876 727 1144 544 731 534 1005 917 1163 982 820 1148 610 1128 966 762 887 456 855 19 379 870 1009 1018 1159 945 59 778 557 459 960 471 689 772 903 786 758 337 851 715 1153 961 1037 973 373 970 867 1022 58 675 1095 1126 746 1010 691 636 682 21 1084 1176 962 796 1191 518 807 692 877 627 342 1035 628 1120 769 969 538 549 803 699 1011 744 1057 854 939 806 705 811 977 1038 581 971 795 1047 1048 732 1096 733 750 745 720 713 29 33 685 711 957 824 925 1151 714 1063 618 1040 1030 826 823 650 1179 948 382 1053 814 774 374 1070 776 984 1162 564 930 1073 364 916 968 878 51 1165 365 721 1069 792 1175 1118 734 797 1034 704 926 709 362 552 748 1058 712 816 695 1158 983 812 716 1021 626 1002 1050 810 845 775 653 598 710 622 1166 449 987 825 666 857 1007 809 928 708 472 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 980 + + + __cstat + 954 + + + BICOMP + 843 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 727 + + + __cstat + 1181 + + + BICOMP + 671 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 1157 1043 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 534 + + + __cstat + 924 + + + BICOMP + 1174 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1043 + + + BICOMP + 668 317 1160 1164 997 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 869 + + + __cstat + 896 + + + BICOMP + 684 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1043 + + + BICOMP + 317 668 1160 1164 997 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 1144 + + + __cstat + 1170 + + + BICOMP + 964 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 1157 1043 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 772 + + + __cstat + 875 + + + BICOMP + 1135 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1113 + + + BICOMP + 702 1183 668 317 919 1164 997 1113 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 14 + + + __cstat + 935 + + + BICOMP + 561 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 951 + + + BICOMP + 1152 951 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 715 + + + __cstat + 633 + + + BICOMP + 1139 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 1180 1164 1183 1113 1182 1152 997 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 857 + + + __cstat + 480 + + + BICOMP + 768 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 928 + + + __cstat + 369 + + + BICOMP + 1036 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 731 + + + __cstat + 907 + + + BICOMP + 332 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1043 + + + BICOMP + 1043 1160 1164 752 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 1148 + + + __cstat + 933 + + + BICOMP + 860 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 952 + + + BICOMP + 317 1164 919 752 1183 702 997 952 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 1165 + + + __cstat + 453 + + + BICOMP + 609 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 952 + + + BICOMP + 702 952 1183 668 317 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 790 + + + __cstat + 1189 + + + BICOMP + 988 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 951 + + + BICOMP + 1180 317 1164 1183 668 1182 1152 997 951 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 1163 + + + __cstat + 910 + + + BICOMP + 884 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 952 + + + BICOMP + 317 1164 919 752 1183 702 997 952 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 610 + + + __cstat + 902 + + + BICOMP + 819 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 897 + + + __cstat + 1147 + + + BICOMP + 575 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 820 + + + __cstat + 1178 + + + BICOMP + 1168 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 952 + + + BICOMP + 317 952 1185 1160 752 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 680 + + + __cstat + 905 + + + BICOMP + 368 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1043 + + + BICOMP + 317 668 1160 1164 997 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 734 + + + __cstat + 640 + + + BICOMP + 1187 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 317 1183 1093 919 1164 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 926 + + + __cstat + 24 + + + BICOMP + 724 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 317 1180 1113 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 18 + + + __cstat + 1150 + + + BICOMP + 333 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 951 + + + BICOMP + 1180 317 1164 1183 668 1182 1152 997 951 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 866 + + + __cstat + 1184 + + + BICOMP + 801 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 951 + + + BICOMP + 1152 951 1182 752 1164 1180 1183 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 982 + + + __cstat + 911 + + + BICOMP + 1074 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 952 + + + BICOMP + 952 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 751 + + + __cstat + 918 + + + BICOMP + 927 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1043 + + + BICOMP + 1185 1160 752 1157 997 1043 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 987 + + + __cstat + 540 + + + BICOMP + 358 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 544 + + + __cstat + 909 + + + BICOMP + 963 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 1157 1043 1185 1160 997 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 968 + + + __cstat + 370 + + + BICOMP + 942 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1043 + + + BICOMP + 755 1014 317 1160 1164 997 668 1043 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 365 + + + __cstat + 344 + + + BICOMP + 1032 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 317 1183 952 919 1164 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 51 + + + __cstat + 351 + + + BICOMP + 338 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 952 + + + BICOMP + 317 702 952 1183 668 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 552 + + + __cstat + 604 + + + BICOMP + 859 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 317 1180 1164 1183 1113 1182 1152 997 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 1069 + + + __cstat + 595 + + + BICOMP + 899 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 878 + + + __cstat + 587 + + + BICOMP + 700 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 952 + + + BICOMP + 317 755 1157 1014 1185 1160 997 668 952 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 826 + + + __cstat + 577 + + + BICOMP + 725 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 1118 + + + __cstat + 37 + + + BICOMP + 743 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1093 + + + BICOMP + 755 1157 1014 1185 1160 997 668 1093 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 748 + + + __cstat + 546 + + + BICOMP + 1003 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 317 1180 1164 1183 1113 1182 1152 997 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 1158 + + + __cstat + 591 + + + BICOMP + 60 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 891 + + + BICOMP + 1180 755 1164 1183 1014 1182 1152 997 668 891 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 721 + + + __cstat + 334 + + + BICOMP + 730 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 364 + + + __cstat + 355 + + + BICOMP + 616 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 317 1157 1043 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 792 + + + __cstat + 579 + + + BICOMP + 872 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 1093 + + + BICOMP + 755 317 1157 1014 1185 1160 997 668 1093 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 1175 + + + __cstat + 588 + + + BICOMP + 986 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 1093 + + + BICOMP + 317 702 1093 1183 668 919 1164 997 755 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 1073 + + + __cstat + 637 + + + BICOMP + 787 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 1043 + + + BICOMP + 317 1043 1157 668 1185 1160 997 755 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 695 + + + __cstat + 545 + + + BICOMP + 799 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 916 + + + __cstat + 590 + + + BICOMP + 738 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1043 + + + BICOMP + 317 1157 1043 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 1034 + + + __cstat + 341 + + + BICOMP + 1026 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 1093 + + + BICOMP + 317 1093 1014 1160 1164 997 668 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 812 + + + __cstat + 330 + + + BICOMP + 1124 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 891 + + + BICOMP + 891 1160 1164 668 997 755 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 337 + + + __cstat + 632 + + + BICOMP + 524 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 317 919 752 1183 702 997 668 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 557 + + + __cstat + 567 + + + BICOMP + 539 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 1183 1093 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 1018 + + + __cstat + 701 + + + BICOMP + 634 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 752 1093 + + + BICOMP + 1093 1185 1160 668 1157 997 752 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 1021 + + + __cstat + 328 + + + BICOMP + 612 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 317 1160 1164 891 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 945 + + + __cstat + 26 + + + BICOMP + 553 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 317 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 903 + + + __cstat + 631 + + + BICOMP + 1054 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1113 + + + BICOMP + 1152 1182 752 1164 1180 1183 997 1113 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 29 + + + __cstat + 322 + + + BICOMP + 1008 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 + + + BICOMP + 1160 1185 755 317 1157 997 668 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 709 + + + __cstat + 22 + + + BICOMP + 1149 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1113 + + + BICOMP + 317 1180 1164 1183 1113 1182 1152 997 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 379 + + + __cstat + 477 + + + BICOMP + 586 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 + + + BICOMP + 1164 1183 1180 1014 1182 1152 997 668 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 1030 + + + __cstat + 48 + + + BICOMP + 1105 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 + + + BICOMP + 1157 752 317 1185 1160 997 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 1058 + + + __cstat + 349 + + + BICOMP + 31 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 1180 1113 317 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 776 + + + __cstat + 597 + + + BICOMP + 1188 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 317 1160 1164 951 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 956 + + + __cstat + 931 + + + BICOMP + 773 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 951 + + + BICOMP + 752 1160 1164 997 951 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 362 + + + __cstat + 350 + + + BICOMP + 1190 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 668 1113 + + + BICOMP + 1180 1113 317 1164 1183 755 1182 1152 997 668 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 876 + + + __cstat + 912 + + + BICOMP + 1027 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1043 + + + BICOMP + 1185 1160 752 1157 997 1043 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 1128 + + + __cstat + 901 + + + BICOMP + 842 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 1070 + + + __cstat + 38 + + + BICOMP + 1016 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 951 + + + BICOMP + 317 951 1160 1164 668 997 755 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 59 + + + __cstat + 536 + + + BICOMP + 1172 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1093 + + + BICOMP + 1164 919 752 1183 702 997 1093 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 983 + + + __cstat + 356 + + + BICOMP + 889 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 755 891 + + + BICOMP + 317 891 1160 1164 668 997 755 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 704 + + + __cstat + 377 + + + BICOMP + 703 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 755 668 1113 + + + BICOMP + 317 702 668 1183 1014 919 1164 997 755 1113 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 797 + + + __cstat + 327 + + + BICOMP + 25 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 317 1183 1093 919 1164 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 716 + + + __cstat + 68 + + + BICOMP + 516 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 317 1160 1164 891 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 471 + + + __cstat + 589 + + + BICOMP + 742 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 1093 + + + BICOMP + 317 1157 668 1185 1160 997 1093 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 689 + + + __cstat + 353 + + + BICOMP + 722 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 598 + + + __cstat + 376 + + + BICOMP + 777 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 472 + + + __cstat + 16 + + + BICOMP + 1173 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 755 + + + BICOMP + 317 919 1164 755 1183 702 997 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 851 + + + __cstat + 630 + + + BICOMP + 1072 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 1113 + + + BICOMP + 1152 1182 752 1164 1180 1183 997 1113 317 1185 1160 1157 919 702 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 1002 + + + __cstat + 347 + + + BICOMP + 729 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 891 + + + BICOMP + 1160 1164 891 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 1159 + + + __cstat + 543 + + + BICOMP + 936 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 809 + + + __cstat + 525 + + + BICOMP + 690 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 887 + + + __cstat + 1177 + + + BICOMP + 782 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 952 + + + BICOMP + 1164 317 919 752 1183 702 997 952 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 459 + + + __cstat + 336 + + + BICOMP + 1062 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1093 + + + BICOMP + 702 1183 1093 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 449 + + + __cstat + 359 + + + BICOMP + 52 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 1166 + + + __cstat + 562 + + + BICOMP + 726 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 758 + + + __cstat + 624 + + + BICOMP + 688 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 960 + + + __cstat + 372 + + + BICOMP + 593 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1093 + + + BICOMP + 1093 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 785 + + + __cstat + 908 + + + BICOMP + 958 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 951 + + + BICOMP + 1160 1164 951 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 710 + + + __cstat + 383 + + + BICOMP + 693 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 997 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 810 + + + __cstat + 470 + + + BICOMP + 830 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 668 317 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 775 + + + __cstat + 375 + + + BICOMP + 629 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 668 + + + BICOMP + 1160 1164 317 668 997 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 966 + + + __cstat + 922 + + + BICOMP + 868 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 952 + + + BICOMP + 702 1183 952 919 1164 997 317 1160 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 762 + + + __cstat + 904 + + + BICOMP + 608 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 952 + + + BICOMP + 952 1185 1160 752 1157 997 668 317 1182 1164 1180 1152 1183 919 702 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 19 + + + __cstat + 635 + + + BICOMP + 978 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 1014 668 755 + + + BICOMP + 1160 1164 755 1014 997 668 317 919 1183 702 1182 1185 1180 1152 1157 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 786 + + + __cstat + 576 + + + BICOMP + 1033 + + + + + ICCARM + 997 317 1182 1160 1164 1180 1156 1152 1183 702 919 1157 1185 752 668 1113 + + + BICOMP + 1164 1113 919 752 1183 702 997 668 317 1160 1182 1185 1180 1152 1157 + + + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m0/iar/example_build/tx.ewd b/ports/cortex_m0/iar/example_build/tx.ewd new file mode 100644 index 00000000..1cc7709f --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m0/iar/example_build/tx.ewp b/ports/cortex_m0/iar/example_build/tx.ewp new file mode 100644 index 00000000..94481d2e --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.ewp @@ -0,0 +1,2745 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m0/iar/example_build/tx.ewt b/ports/cortex_m0/iar/example_build/tx.ewt new file mode 100644 index 00000000..efc25ef4 --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx.ewt @@ -0,0 +1,3406 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m0/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m0/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..4d7fdbea --- /dev/null +++ b/ports/cortex_m0/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,190 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 50000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: + +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + MOVS r2, #1 + ORRS r1, r1, r2 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD08 ; Offset to vector base register + ADD r0, r0, r2 ; Build vector base register + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOVS r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD18 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD1C ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + LDR r0, =0xE000E000 ; Build address of NVIC registers + LDR r2, =0xD20 ; + ADD r0, r0, r2 ; + STR r1, [r0] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +__tx_SysTickHandler: +SysTick_Handler: +; VOID SysTick_Handler (VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, r1} + MOV lr, r1 + BX lr +; } + END diff --git a/ports/cortex_m0/iar/inc/tx_port.h b/ports/cortex_m0/iar/inc/tx_port.h new file mode 100644 index 00000000..d4501e76 --- /dev/null +++ b/ports/cortex_m0/iar/inc/tx_port.h @@ -0,0 +1,365 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M0/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M0 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M0/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_m0/iar/readme_threadx.txt b/ports/cortex_m0/iar/readme_threadx.txt new file mode 100644 index 00000000..4b6e3f6c --- /dev/null +++ b/ports/cortex_m0/iar/readme_threadx.txt @@ -0,0 +1,158 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M0 + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-M0 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-M0 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M0 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M0 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0} + MOV lr, r0 + BX lr + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-M0 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m0/iar/src/tx_iar.c b/ports/cortex_m0/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m0/iar/src/tx_thread_context_restore.s b/ports/cortex_m0/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..9191562a --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_context_restore.s @@ -0,0 +1,106 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Preemption has already been addressed - just return! */ +; + POP {r0} + MOV lr, r0 + BX lr +; +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_context_save.s b/ports/cortex_m0/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..c598b3fe --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_context_save.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, r1} ; Recover return address + MOV lr, r1 ; +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END diff --git a/ports/cortex_m0/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m0/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..6f870e9b --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..32f155cb --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..cadf01e4 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m0/iar/src/tx_thread_schedule.s b/ports/cortex_m0/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..6b9830cf --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_schedule.s @@ -0,0 +1,272 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M0 +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOVS r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load ICSR address + STR r0, [r1] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switch-out switch-in handler... */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, r1} ; Recover LR + MOV lr, r1 ; + CPSIE i ; Enable interrupts +#endif + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + MOVS r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CMP r1,#0 ; If NULL, skip preservation + BEQ __tx_ts_new ; +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r3, PSP ; Pickup PSP pointer (thread's stack pointer) + SUBS r3, r3, #16 ; Allocate stack space + STM r3!, {r4-r7} ; Save its remaining registers (M3 Instruction: STMDB r12!, {r4-r11}) + MOV r4,r8 ; + MOV r5,r9 ; + MOV r6,r10 ; + MOV r7,r11 ; + SUBS r3, r3, #32 ; Allocate stack space + STM r3!, {r4-r7} ; + SUBS r3, r3, #20 ; Allocate stack space + MOV r5, LR ; + STR r5, [r3] ; Save LR on the stack + STR r3, [r1, #8] ; Save its stack pointer +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r4] ; Pickup current time-slice + CMP r5, #0 ; If not active, skip processing + BEQ __tx_ts_new ; +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + MOVS r5, #0 ; Build clear value + STR r5, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CMP r1, #0 ; + BEQ __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + LDR r4, =_tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADDS r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r3, [r1, #8] ; Pickup thread's stack pointer + LDR r5, [r3] ; Recover saved LR + ADDS r3, r3, #4 ; Position past LR + MOV lr, r5 ; Restore LR + LDM r3!,{r4-r7} ; Recover thread's registers (r4-r11) + MOV r11,r7 ; + MOV r10,r6 ; + MOV r9,r5 ; + MOV r8,r4 ; + LDM r3!,{r4-r7} ; + MSR PSP, r3 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CMP r1, #0 ; If non-NULL, a new thread is ready! + BNE __tx_ts_ready ; +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + LDR r7, =0x08000000 ; Build clear PendSV value + LDR r5, =0xE000ED04 ; Build base NVIC address + STR r7, [r5] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_stack_build.s b/ports/cortex_m0/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..f1073d54 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_stack_build.s @@ -0,0 +1,145 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M0 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + MOVS r3, #0x7 ; + BICS r2, r2, r3 ; Align frame for 8-byte alignment + SUBS r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOVS r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r8 + STR r3, [r2, #8] ; Store initial r9 + STR r3, [r2, #12] ; Store initial r10 + STR r3, [r2, #16] ; Store initial r11 + STR r3, [r2, #20] ; Store initial r4 + STR r3, [r2, #24] ; Store initial r5 + STR r3, [r2, #28] ; Store initial r6 + STR r3, [r2, #32] ; Store initial r7 +; +; /* Hardware stack follows. */ +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + LDR r3, =0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + LDR r3, =0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_thread_system_return.s b/ports/cortex_m0/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..3035fd25 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_thread_system_return.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + LDR r0, =0x10000000 ; Load PENDSVSET bit + LDR r1, =0xE000ED04 ; Load NVIC base + STR r0, [r1] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m0/iar/src/tx_timer_interrupt.s b/ports/cortex_m0/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..a04ccf59 --- /dev/null +++ b/ports/cortex_m0/iar/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M0/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADDS r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUBS r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOVS r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOVS r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADDS r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired: +; +; + PUSH {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + LDR r0, =_tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CMP r1, #0 ; + BNE __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + LDR r2, =_tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + LDR r0, =0xE000ED04 ; Build address of control register + LDR r2, =0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + POP {r0, r1} ; Recover lr register (r0 is just there for + MOV lr, r1 ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_m3/ac5/example_build/build_threadx.bat b/ports/cortex_m3/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..8fc64ee9 --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m3 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m3 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-m3 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m3/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m3/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..f1f517c4 --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m3 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m3 -O2 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m3/ac5/example_build/sample_threadx.c b/ports/cortex_m3/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..3e92d7ca --- /dev/null +++ b/ports/cortex_m3/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,259 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + LDR R0, =__main + BX R0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + STACK_SIZE) + LDR R2, =(HeapMem + HEAP_SIZE) + LDR R3, =StackMem + BX LR +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END diff --git a/ports/cortex_m3/ac5/inc/tx_port.h b/ports/cortex_m3/ac5/inc/tx_port.h new file mode 100644 index 00000000..259deceb --- /dev/null +++ b/ports/cortex_m3/ac5/inc/tx_port.h @@ -0,0 +1,342 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M3/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M3/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif diff --git a/ports/cortex_m3/ac5/readme_threadx.txt b/ports/cortex_m3/ac5/readme_threadx.txt new file mode 100644 index 00000000..523279a3 --- /dev/null +++ b/ports/cortex_m3/ac5/readme_threadx.txt @@ -0,0 +1,145 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Using ARM Compiler 5 (AC5) + + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +development environment. At this point you may run the build_threadx.bat batch +file. This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M3 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/ac5/src/tx_thread_context_restore.s b/ports/cortex_m3/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..eb6c205f --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_context_save.s b/ports/cortex_m3/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..4dfc3352 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_context_save.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..8951fc9d --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,80 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..d7fd0951 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,78 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..f5c6d3ba --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,77 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m3/ac5/src/tx_thread_schedule.s b/ports/cortex_m3/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..a0cbd6a7 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_schedule.s @@ -0,0 +1,248 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + ALIGN + LTORG + END + diff --git a/ports/cortex_m3/ac5/src/tx_thread_stack_build.s b/ports/cortex_m3/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..023e14c4 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,138 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M3 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/ac5/src/tx_thread_system_return.s b/ports/cortex_m3/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..0e88b617 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_thread_system_return.s @@ -0,0 +1,91 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/ac5/src/tx_timer_interrupt.s b/ports/cortex_m3/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..e9a43031 --- /dev/null +++ b/ports/cortex_m3/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,266 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m3/gnu/CMakeLists.txt b/ports/cortex_m3/gnu/CMakeLists.txt index cb3091b9..71e2d4f2 100644 --- a/ports/cortex_m3/gnu/CMakeLists.txt +++ b/ports/cortex_m3/gnu/CMakeLists.txt @@ -9,7 +9,6 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_stack_build.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.S - # {{END_TARGET_SOURCES}} ) diff --git a/ports/cortex_m3/gnu/example_build/build_threadx.bat b/ports/cortex_m3/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..79f240b0 --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m3/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m3/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..cc93371f --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb tx_simulator_startup.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb cortexm3_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m3 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m3 -ereset_handler -T sample_threadx.ld tx_simulator_startup.o cortexm3_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m3/gnu/example_build/cortexm3_crt0.s b/ports/cortex_m3/gnu/example_build/cortexm3_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/cortexm3_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m3/gnu/example_build/libc.a b/ports/cortex_m3/gnu/example_build/libc.a new file mode 100644 index 00000000..6c1567d1 Binary files /dev/null and b/ports/cortex_m3/gnu/example_build/libc.a differ diff --git a/ports/cortex_m3/gnu/example_build/sample_threadx.c b/ports/cortex_m3/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..597f373c --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m3/gnu/example_build/sample_threadx.ld b/ports/cortex_m3/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m3/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m3/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m3/gnu/example_build/tx_initialize_low_level.S similarity index 95% rename from ports/cortex_m3/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m3/gnu/example_build/tx_initialize_low_level.S index bfa6e423..3eaf5731 100644 --- a/ports/cortex_m3/gnu/src/tx_initialize_low_level_sample.S +++ b/ports/cortex_m3/gnu/example_build/tx_initialize_low_level.S @@ -59,7 +59,7 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M3/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -93,6 +93,9 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), fixed */ +@/* GNU assembly comment, */ +@/* resulting in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_initialize_low_level(VOID) @@ -191,14 +194,14 @@ __tx_IntHandler: @ { PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif @ /* Do interrupt handler work here */ @ /* BL .... */ #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR @@ -216,11 +219,11 @@ SysTick_Handler: @ PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif BL _tx_timer_interrupt #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR diff --git a/ports/cortex_m3/gnu/src/tx_vector_table_sample.S b/ports/cortex_m3/gnu/example_build/tx_simulator_startup.s similarity index 100% rename from ports/cortex_m3/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m3/gnu/example_build/tx_simulator_startup.s diff --git a/ports/cortex_m3/gnu/readme_threadx.txt b/ports/cortex_m3/gnu/readme_threadx.txt new file mode 100644 index 00000000..92c2045d --- /dev/null +++ b/ports/cortex_m3/gnu/readme_threadx.txt @@ -0,0 +1,153 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M3 + +The ThreadX demonstration is designed to execute on Cortex-M3 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using gnu tools uses the standard GNU +Cortex-M3 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +ISRs can be written completely in C (or assembly language) without any calls to +_tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed access to the +ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + + .global your_assembly_isr + .thumb_func +your_assembly_isr: +; VOID your_assembly_isr(VOID) +; { + PUSH {r0, lr} +; +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, lr} + BX lr +; } + +Note: the Cortex-M3 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M3 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/gnu/src/tx_thread_stack_build.S b/ports/cortex_m3/gnu/src/tx_thread_stack_build.S index bec56d45..35d6e2ca 100644 --- a/ports/cortex_m3/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m3/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M3/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -91,7 +96,7 @@ _tx_thread_stack_build: @ r7 Initial value for r7 @ r8 Initial value for r8 @ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) +@ r10 Initial value for r10 @ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @@ -119,9 +124,7 @@ _tx_thread_stack_build: STR r3, [r2, #16] @ Store initial r7 STR r3, [r2, #20] @ Store initial r8 STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOV r3, #0 @ Build initial register value + STR r3, [r2, #28] @ Store initial r10 STR r3, [r2, #32] @ Store initial r11 @ @ /* Hardware stack follows. */ diff --git a/ports/cortex_m3/iar/example_build/azure_rtos.eww b/ports/cortex_m3/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m3/iar/example_build/cstartup_M.s b/ports/cortex_m3/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..75d9369b --- /dev/null +++ b/ports/cortex_m3/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(1) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + B __iar_program_start + + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.c b/ports/cortex_m3/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..c67d75d0 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.c @@ -0,0 +1,385 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define event buffer. */ + +#ifdef TX_ENABLE_EVENT_TRACE +UCHAR trace_buffer[0x10000]; +#endif + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + +#ifdef TX_ENABLE_EVENT_TRACE + tx_trace_enable(trace_buffer, sizeof(trace_buffer), 32); +#endif + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.dep b/ports/cortex_m3/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..55bb03a6 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.dep @@ -0,0 +1,128 @@ + + + 4 + 3533065436 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\src\tx_initialize_low_level.s + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\lib\dl7M_tln.a + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\lib\m7M_tl.a + + + [ROOT_NODE] + + + ILINK + 15 31 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 7 + + + + + $PROJ_DIR$\..\src\tx_initialize_low_level.s + + + AARM + 7 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 31 + + + + + ILINK + 19 23 14 27 7 28 29 32 30 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 23 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 14 + + + __cstat + 0 + + + BICOMP + 13 + + + + + ICCARM + 24 9 2 4 17 12 8 11 21 3 16 18 5 1 20 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.ewd b/ports/cortex_m3/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..9df387fc --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.ewp b/ports/cortex_m3/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..488ff799 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2127 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.ewt b/ports/cortex_m3/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..72ce9e69 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m3/iar/example_build/sample_threadx.icf b/ports/cortex_m3/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..eae0fd73 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/sample_threadx.icf @@ -0,0 +1,34 @@ +define symbol __ICFEDIT_intvec_start__ = 0x0; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x80; +define symbol __ICFEDIT_region_ROM_end__ = 0x1FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x100000; +define symbol __ICFEDIT_region_RAM_end__ = 0x1FFFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x8000; +/**** End of ICF editor section. ###ICF###*/ + +define symbol __ICFEDIT_size_freemem__ = 0x100000; + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; +define region RAM_freemem = mem:[from 0x200000 to 0x300000]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP}; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..97c89213 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 280 + 30 + 30 + 30 + + + <ws> + + + + 14 + 26 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 020000003000578600000100000029810000020000001386000008000000259600000100000000DA000001000000268100000100000059920000010000000184000001000000108600002B00000029E10000020000000F810000010000002081000001000000ED8000000100000008DA000001000000EA800000010000001D8100000200000001E10000010000000D800000010000000C8100000600000003DC0000010000000486000001000000038400000500000056860000010000001781000003000000249600000100000007B000000100000014810000010000000C8600000100000000810000020000000E81000001000000EC800000010000001A8600000100000003E10000020000000B81000002000000E98000000200000014860000020000005586000001000000F48000000100000000860000010000000284000001000000118600002A00000046810000020000002481000001000000EB800000020000000D81000003000000088600000100000006DA000001000000E880000001000000 + + + 10000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000484000006840000008800000188000002880000038800000488000005880000 + 040030840000520000000E840000500000000B8100001F0000000D81000021000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000007040000000A000065050000 + 00000000F0030000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m3\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000008040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m3\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 000000003200000060010000EC030000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF600100003200000064010000EC0300000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF00000000EC030000000A0000F0030000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000007040000000A00006505000000000000F0030000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..00208544 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..2894c7df --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..11a77ea1 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M3" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..ce257367 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx_github\ports\cortex_m3\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m3/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..aebcbbc8 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1623 @@ + + + + + + + 3 + 0 + 0 + + + Build + + + + 20 + 1725 + + + 20 + 1293 + 345 + 86 + + 3 + 0 + 0 + + + Debug-Log + + + + + + + 523 + 27 + 27 + 27 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + + 2 + 0 + 0 + + + + + + + + + 100 + 100 + 100 + 100 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 192 + 150 + 100 + 100 + + + + + + + + TabID-30473-31614 + Workspace + Workspace + + + <ws> + sample_threadx + + + + + 0 + + + + + + + TabID-29348-22201 + Debug Log + Debug-Log + + + + 0 + + + + + TabID-22784-19201 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 0 + 0 + 0 + 0 + 51 + 1984 + 1984 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + + + + -2 + -2 + 647 + 597 + -2 + -2 + 248 + 222 + 143022 + 237179 + 345444 + 693376 + + + + + + + + + + + -2 + -2 + 647 + 385 + -2 + -2 + 200 + 200 + 115340 + 213675 + 223183 + 693376 + + + + + + + + + + + + + + -2 + -2 + 220 + 1736 + -2 + -2 + 1738 + 222 + 1002307 + 237179 + 143022 + 237179 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + _tx_timer_system_clock + + + + Expression + Location + Type + Value + + + 176 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 6B00000030002596000001000000138600000800000029810000020000005786000001000000108600002B00000001840000010000005992000001000000268100000100000000DA00000100000029E1000002000000ED8000000100000020810000010000000F810000010000000C810000060000000D8000000100000001E10000010000001D81000002000000EA8000000100000008DA000001000000048600000100000003DC0000010000002496000001000000178100000300000056860000010000000384000005000000148100000100000007B000000100000000810000020000000C8600000100000003E10000020000001A86000001000000EC800000010000000E81000001000000E9800000020000000B810000020000001486000002000000118600002A00000002840000010000000086000001000000F48000000100000055860000010000002481000001000000468100000200000008860000010000000D81000002000000EB80000002000000E88000000100000006DA000001000000 + + + 1500FFFFFFFF748600007784000007840000808C000044D500008386000058860000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 45005786000018000000048400007A000000138600002F000000158100005300000059920000240000007686000039000000108600002D00000007E100006900000023920000000000003184000081000000848600003A00000004E100006700000020810000590000000F8100005100000001E10000640000000D800000450000001D920000110000000786000028000000008D00001E0000000C8100004E0000000486000025000000068400007C00000017810000550000009A8600001600000003840000790000005686000033000000148100005200000025920000190000000084000076000000008100004700000044920000220000000E8400007E000000308400008000000003E10000660000001F9200001F0000001A860000320000001F810000580000000E810000500000005E8600003500000000E10000630000002D9200002100000006860000270000008E8600003B0000000B8100004D00000041E10000730000006986000038000000058400007B00000014860000300000001681000054000000239600008700000055860000060000000284000078000000118600002E0000000E86000017000000108400007F0000003284000082000000468100006000000005E10000680000005184000084000000608600003700000002E1000065000000C386000003000000A18600003C0000000A8400007D0000000D8100004F0000005D860000340000002C920000200000000586000026000000C08600000A000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000CA020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + F6070000930000001809000043010000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34065 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34067 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34101 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34113 + F6070000930000001809000043010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + F607000093000000760A000023010000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + F607000093000000A409000023010000 + 040000003B0200009F06000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + F6070000930000001809000043010000 + 0000000037020000A3060000B3020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34058 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34062 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + F6070000930000001809000053010000 + 040000000B0200009F06000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34104 + F607000093000000FC080000F3010000 + 040000004A0000000201000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + F607000093000000FC080000F3010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34105 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + F607000093000000A409000053010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + F607000093000000A409000053010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + F6070000930000001809000043010000 + 0A01000003020000A3060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + F6070000930000001809000043010000 + 0A01000003020000A3060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34117 + F6070000930000001809000043010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + F607000093000000FC080000F3010000 + B90700004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34119 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34121 + F607000093000000FC080000F3010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000001000000FFFFFFFFFFFFFFFFB50700004C000000B90700009A040000010000000200001004000000010000005AF9FFFFF6010000468500000000000000000000000000000000000001000000468500000100000046850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A306000003020000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A306000003020000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000010000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF010000004A850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CA020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004A85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4A85000001000000FFFFFFFF4A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000378500000000000000000000000000000000000001000000378500000100000037850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EF010000A3060000F3010000000000000100000004000000010000000000000000000000FFFFFFFF040000001B8500001C8500001D8500001E85000001800080000000000000000000000A020000A3060000CA02000000000000F3010000A3060000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001D85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001E85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1B85000001000000FFFFFFFF1B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000E85000000000000000000000000000000000000010000000E850000010000000E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000080000000000000FFFFFFFFFFFFFFFF000000001F020000A306000023020000000000000100000004000000010000000000000000000000FFFFFFFF010000002085000001800080000000000000000000003A020000A3060000CA0200000000000023020000A3060000B3020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000002085000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF2085000001000000FFFFFFFF20850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000F85000011850000128500001385000035850000418500000180008000000100000000000000CE020000A40600007E030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001385000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003585000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004185000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000063000000FFFEFF000000000000000000000000000100000001000000018001E100000000000064000000FFFEFF000000000000000000000000000100000001000000018003E100000000040066000000FFFEFF0000000000000000000000000001000000010000000180008100000000000047000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000040069000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040070000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005A000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018029E10000000004006F000000FFFEFF0000000000000000000000000001000000010000000180028100000000040049000000FFFEFF000000000000000000000000000100000001000000018029810000000004005E000000FFFEFF000000000000000000000000000100000001000000018027810000000004005C000000FFFEFF000000000000000000000000000100000001000000018028810000000004005D000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040056000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040057000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004D000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004E000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000062000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000058000000FFFEFF0000000000000000000000000001000000010000000180208100000000000059000000FFFEFF0000000000000000000000000001000000010000000180468100000000000060000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34127 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34123 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..0fa79328 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 1618778298 + + + 0 + 0 + 0 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..11a77ea1 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M3" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.crun b/ports/cortex_m3/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.dbgdt b/ports/cortex_m3/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m3/iar/example_build/settings/tx.dnx b/ports/cortex_m3/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_m3/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m3/iar/example_build/tx.dep b/ports/cortex_m3/iar/example_build/tx.dep new file mode 100644 index 00000000..1bcebb99 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.dep @@ -0,0 +1,9780 @@ + + + 4 + 1228130052 + + Debug + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\src\tx_initialize_low_level.s + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\tx_misra.s + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_misra.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\tx_misra.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\List\tx_misra.lst + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\List\tx_misra.s + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_event_flags.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $PROJ_DIR$\..\src\tx_misra.s + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + [ROOT_NODE] + + + IARCHIVE + 484 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 712 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 895 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 857 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 771 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 851 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 537 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 752 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 663 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 541 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 544 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 720 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 462 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 474 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 587 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 476 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 875 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 788 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 818 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 695 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 577 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 901 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 763 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 728 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 770 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 573 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 447 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 419 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 919 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 772 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 580 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 873 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 755 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 570 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 838 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 4 10 18 20 9 3 8 1 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 810 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 811 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 8 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 656 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 626 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 443 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 549 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 515 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 504 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 871 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 867 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 843 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 786 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 756 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\src\tx_initialize_low_level.s + + + AARM + 998 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 627 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 848 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 814 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 860 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 5 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 947 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 603 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 912 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 3 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 731 + + + __cstat + 411 + + + BICOMP + 617 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 699 540 1000 191 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 643 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 806 + + + __cstat + 881 + + + BICOMP + 183 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 973 699 693 972 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 829 + + + __cstat + 448 + + + BICOMP + 888 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 819 + + + __cstat + 441 + + + BICOMP + 804 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 154 + + + BICOMP + 154 675 191 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 561 + + + __cstat + 679 + + + BICOMP + 482 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 896 + + + __cstat + 456 + + + BICOMP + 721 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 816 + + + __cstat + 633 + + + BICOMP + 830 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 973 520 154 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 590 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 624 + + + __cstat + 107 + + + BICOMP + 620 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 533 + + + __cstat + 404 + + + BICOMP + 600 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 973 675 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 454 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 517 + + + __cstat + 574 + + + BICOMP + 599 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 124 + + + __cstat + 948 + + + BICOMP + 852 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 973 523 699 960 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 795 + + + __cstat + 480 + + + BICOMP + 518 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 120 + + + BICOMP + 520 973 704 154 584 699 693 1000 120 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 786 + + + __cstat + 516 + + + BICOMP + 719 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 960 + + + BICOMP + 704 699 154 735 523 1000 960 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 405 + + + __cstat + 631 + + + BICOMP + 531 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 120 + + + BICOMP + 520 973 704 154 584 699 693 1000 120 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 506 + + + __cstat + 845 + + + BICOMP + 842 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 973 120 699 154 735 523 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 700 + + + __cstat + 501 + + + BICOMP + 634 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 741 + + + __cstat + 636 + + + BICOMP + 779 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 872 + + + __cstat + 623 + + + BICOMP + 390 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 973 960 540 154 745 1000 113 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + __cstat + 429 + + + BICOMP + 571 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 940 + + + __cstat + 556 + + + BICOMP + 485 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 706 + + + __cstat + 473 + + + BICOMP + 849 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 973 520 154 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 431 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 372 + + + __cstat + 606 + + + BICOMP + 471 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 628 + + + __cstat + 676 + + + BICOMP + 525 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 536 + + + __cstat + 421 + + + BICOMP + 777 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 113 + + + BICOMP + 113 675 154 973 540 704 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 580 + + + __cstat + 934 + + + BICOMP + 457 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 766 + + + __cstat + 727 + + + BICOMP + 937 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 510 + + + __cstat + 493 + + + BICOMP + 492 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 973 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 916 + + + __cstat + 530 + + + BICOMP + 874 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 461 + + + __cstat + 828 + + + BICOMP + 836 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 619 + + + __cstat + 661 + + + BICOMP + 781 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 973 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 468 + + + __cstat + 524 + + + BICOMP + 757 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 730 + + + __cstat + 435 + + + BICOMP + 538 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 113 + + + BICOMP + 113 973 675 154 540 704 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 543 + + + __cstat + 692 + + + BICOMP + 800 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 973 520 704 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 586 + + + __cstat + 893 + + + BICOMP + 931 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 443 + + + __cstat + 597 + + + BICOMP + 445 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 973 540 154 745 1000 113 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 801 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 393 + + + __cstat + 412 + + + BICOMP + 382 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 815 + + + __cstat + 846 + + + BICOMP + 929 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 809 + + + __cstat + 635 + + + BICOMP + 853 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 960 + + + BICOMP + 704 973 699 154 735 523 1000 960 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 847 + + + __cstat + 433 + + + BICOMP + 553 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 532 + + + __cstat + 420 + + + BICOMP + 887 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 422 + + + __cstat + 646 + + + BICOMP + 803 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 886 + + + __cstat + 702 + + + BICOMP + 775 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 772 + + + __cstat + 840 + + + BICOMP + 718 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 792 + + + __cstat + 519 + + + BICOMP + 585 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 865 + + + __cstat + 906 + + + BICOMP + 469 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 923 + + + BICOMP + 699 923 704 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 717 + + + __cstat + 551 + + + BICOMP + 798 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 783 + + + __cstat + 564 + + + BICOMP + 820 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 120 + + + BICOMP + 520 973 704 154 584 699 693 1000 120 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 479 + + + __cstat + 522 + + + BICOMP + 734 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 + + + BICOMP + 745 113 973 523 699 1000 704 923 540 735 675 584 520 693 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 737 + + + __cstat + 384 + + + BICOMP + 773 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 699 540 1000 191 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 715 + + + __cstat + 503 + + + BICOMP + 607 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 608 + + + __cstat + 394 + + + BICOMP + 894 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 120 + + + BICOMP + 523 699 973 735 113 704 1000 120 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 834 + + + __cstat + 494 + + + BICOMP + 879 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 973 745 154 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 945 + + + __cstat + 649 + + + BICOMP + 701 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 968 + + + BICOMP + 704 191 520 923 584 699 693 1000 113 968 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 391 + + + __cstat + 487 + + + BICOMP + 527 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 428 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 914 + + + __cstat + 678 + + + BICOMP + 414 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 120 + + + BICOMP + 973 584 120 699 693 113 520 704 1000 191 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 862 + + + __cstat + 650 + + + BICOMP + 610 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 885 + + + __cstat + 502 + + + BICOMP + 475 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 604 + + + __cstat + 162 + + + BICOMP + 514 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 489 + + + __cstat + 638 + + + BICOMP + 579 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 973 745 915 699 540 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 640 + + + __cstat + 908 + + + BICOMP + 612 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 523 699 960 973 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 769 + + + __cstat + 949 + + + BICOMP + 759 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 973 523 699 735 960 704 1000 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 710 + + + __cstat + 438 + + + BICOMP + 744 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 738 + + + __cstat + 660 + + + BICOMP + 802 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 973 745 915 699 540 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 645 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 446 + + + __cstat + 395 + + + BICOMP + 831 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 973 675 154 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 629 + + + __cstat + 423 + + + BICOMP + 822 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 453 + + + __cstat + 450 + + + BICOMP + 825 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 436 + + + __cstat + 567 + + + BICOMP + 918 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 990 + + + BICOMP + 990 745 113 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 472 + + + __cstat + 410 + + + BICOMP + 724 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 496 + + + __cstat + 927 + + + BICOMP + 508 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 120 + + + BICOMP + 523 699 191 735 923 704 1000 113 120 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 464 + + + __cstat + 938 + + + BICOMP + 136 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 973 523 699 735 960 704 1000 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 890 + + + __cstat + 545 + + + BICOMP + 616 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 523 699 960 973 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 808 + + + __cstat + 942 + + + BICOMP + 396 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 392 + + + __cstat + 459 + + + BICOMP + 832 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 699 540 1000 191 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 632 + + + __cstat + 463 + + + BICOMP + 615 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 925 + + + __cstat + 340 + + + BICOMP + 899 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 + + + BICOMP + 704 520 154 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 397 + + + __cstat + 378 + + + BICOMP + 630 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 582 + + + __cstat + 328 + + + BICOMP + 583 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 559 + + + __cstat + 369 + + + BICOMP + 614 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 675 1000 191 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 826 + + + __cstat + 426 + + + BICOMP + 511 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 540 699 191 745 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 732 + + + __cstat + 322 + + + BICOMP + 416 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 386 + + + __cstat + 677 + + + BICOMP + 892 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 973 699 693 972 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 924 + + + __cstat + 542 + + + BICOMP + 910 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 900 + + + __cstat + 455 + + + BICOMP + 797 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 787 + + + __cstat + 439 + + + BICOMP + 179 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 833 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 593 + + + __cstat + 558 + + + BICOMP + 576 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 973 675 968 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 548 + + + __cstat + 409 + + + BICOMP + 591 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 703 + + + __cstat + 667 + + + BICOMP + 509 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 960 + + + BICOMP + 523 699 960 973 735 191 704 1000 113 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 812 + + + __cstat + 642 + + + BICOMP + 922 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 973 699 693 120 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + __cstat + 415 + + + BICOMP + 742 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 418 + + + __cstat + 575 + + + BICOMP + 425 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 923 + + + BICOMP + 699 923 704 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 402 + + + __cstat + 743 + + + BICOMP + 767 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 990 + + + BICOMP + 973 191 675 923 540 704 1000 113 990 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 793 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 790 + + + __cstat + 326 + + + BICOMP + 736 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 972 + + + BICOMP + 584 972 973 699 693 113 520 704 1000 191 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 805 + + + __cstat + 407 + + + BICOMP + 782 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 191 + + + BICOMP + 191 675 154 540 704 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 529 + + + __cstat + 413 + + + BICOMP + 444 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 861 + + + __cstat + 164 + + + BICOMP + 442 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 973 675 154 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 756 + + + __cstat + 535 + + + BICOMP + 102 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 523 699 735 960 704 1000 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 835 + + + __cstat + 500 + + + BICOMP + 451 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 481 + + + __cstat + 491 + + + BICOMP + 707 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 437 + + + __cstat + 659 + + + BICOMP + 824 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 990 + + + BICOMP + 973 990 745 113 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 764 + + + __cstat + 539 + + + BICOMP + 733 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 120 + + + BICOMP + 704 120 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 596 + + + __cstat + 86 + + + BICOMP + 398 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 850 + + + __cstat + 891 + + + BICOMP + 497 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 191 113 960 + + + BICOMP + 973 113 745 923 699 540 1000 191 960 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 529 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 536 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 372 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 737 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 629 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 925 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 885 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 388 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 774 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 787 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 730 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 834 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 586 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 645 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 454 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 819 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 342 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 392 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 559 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 632 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 533 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 393 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 833 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 731 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 431 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 510 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 418 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 4 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 847 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 805 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 532 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 700 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 792 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 916 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 795 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 405 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 717 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 428 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 766 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 706 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 886 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 896 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 481 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 924 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 590 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 816 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 643 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 835 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 608 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 506 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 624 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 793 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 872 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 809 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 9 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 801 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 940 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 461 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 783 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 715 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 479 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 865 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 4 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 764 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 468 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 582 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 829 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 604 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 472 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 453 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 861 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 732 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 397 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 790 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 941 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 841 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 391 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 778 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 596 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 486 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 389 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 618 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 826 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 900 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 386 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 768 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 593 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 355 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 446 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 402 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 806 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 1 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 437 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 436 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 945 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 2 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 427 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 548 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 710 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 5 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 765 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 124 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 780 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 914 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 609 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 812 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 907 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 561 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 738 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 647 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 517 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 464 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 751 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 789 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 859 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 3 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 640 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 697 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 489 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 703 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 611 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 694 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 682 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 8 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 496 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 850 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 722 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 713 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 478 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 862 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 890 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 10 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 769 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 9 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 808 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 20 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 546 + + + __cstat + 796 + + + BICOMP + 754 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 342 + + + __cstat + 495 + + + BICOMP + 921 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 + + + BICOMP + 704 540 191 973 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 478 + + + __cstat + 681 + + + BICOMP + 377 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 841 + + + __cstat + 753 + + + BICOMP + 335 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 968 + + + BICOMP + 704 191 520 923 584 699 693 1000 113 968 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 859 + + + __cstat + 651 + + + BICOMP + 601 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 768 + + + __cstat + 595 + + + BICOMP + 748 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 968 + + + BICOMP + 973 968 675 113 540 704 1000 191 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 389 + + + __cstat + 655 + + + BICOMP + 637 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 486 + + + __cstat + 685 + + + BICOMP + 555 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 972 + + + BICOMP + 523 699 191 973 735 923 704 1000 113 972 675 540 745 584 520 693 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 903 + + + __cstat + 671 + + + BICOMP + 705 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 355 + + + __cstat + 562 + + + BICOMP + 823 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 968 + + + BICOMP + 704 191 520 923 973 584 699 693 1000 113 968 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 856 + + + __cstat + 889 + + + BICOMP + 505 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 761 + + + __cstat + 666 + + + BICOMP + 458 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 751 + + + __cstat + 673 + + + BICOMP + 534 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 973 699 693 120 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 911 + + + __cstat + 664 + + + BICOMP + 424 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 778 + + + __cstat + 683 + + + BICOMP + 670 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 972 + + + BICOMP + 973 584 972 699 693 113 520 704 1000 191 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 765 + + + __cstat + 565 + + + BICOMP + 877 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 915 + + + BICOMP + 191 973 675 923 540 704 1000 113 915 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 611 + + + __cstat + 408 + + + BICOMP + 776 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 915 + + + BICOMP + 973 704 915 520 923 584 699 693 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 388 + + + __cstat + 452 + + + BICOMP + 385 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 191 + + + BICOMP + 745 154 973 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 609 + + + __cstat + 863 + + + BICOMP + 552 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 120 + + + BICOMP + 584 120 699 693 113 520 704 1000 191 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 696 + + + __cstat + 662 + + + BICOMP + 762 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 + + + BICOMP + 973 540 699 191 745 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 780 + + + __cstat + 658 + + + BICOMP + 648 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 960 + + + BICOMP + 973 523 699 735 960 704 1000 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 427 + + + __cstat + 119 + + + BICOMP + 920 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 191 113 + + + BICOMP + 704 973 540 191 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 941 + + + __cstat + 430 + + + BICOMP + 791 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 + + + BICOMP + 675 154 973 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 696 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 930 + + + __cstat + 813 + + + BICOMP + 334 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 675 1000 191 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 903 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 789 + + + __cstat + 760 + + + BICOMP + 866 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 856 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 422 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 907 + + + __cstat + 882 + + + BICOMP + 528 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 699 693 584 113 973 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 761 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 815 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 697 + + + __cstat + 690 + + + BICOMP + 794 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 915 + + + BICOMP + 973 915 745 113 699 540 1000 191 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 618 + + + __cstat + 876 + + + BICOMP + 401 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 973 675 968 540 704 1000 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 619 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 647 + + + __cstat + 592 + + + BICOMP + 387 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 973 745 990 699 540 1000 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 911 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 628 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 741 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 546 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 18 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 400 + + + __cstat + 686 + + + BICOMP + 625 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 191 + + + BICOMP + 704 540 113 675 1000 191 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 682 + + + __cstat + 434 + + + BICOMP + 654 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 915 + + + BICOMP + 191 675 923 540 704 1000 113 915 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 722 + + + __cstat + 652 + + + BICOMP + 951 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 973 699 693 120 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 543 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 4 10 18 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 930 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 713 + + + __cstat + 680 + + + BICOMP + 644 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 120 + + + BICOMP + 584 699 693 120 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 694 + + + __cstat + 641 + + + BICOMP + 470 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 + + + BICOMP + 973 699 693 584 113 520 704 1000 745 540 735 675 523 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 400 + + + + + ICCARM + 0 16 735 704 699 584 674 520 540 523 745 693 675 991 995 10 18 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 763 857 537 587 818 476 474 695 728 541 770 663 544 720 771 577 901 712 875 895 851 462 752 788 848 447 873 755 814 912 603 656 838 626 549 811 860 419 871 947 515 627 573 504 570 867 843 810 919 772 443 786 580 756 461 766 872 468 809 506 608 795 764 886 783 916 835 481 717 792 405 590 643 865 715 706 940 624 479 428 793 801 896 924 816 510 372 925 418 833 632 532 529 645 723 787 847 586 536 454 730 805 819 774 533 393 737 731 629 834 700 885 388 342 392 559 431 829 391 826 604 427 548 941 710 582 596 472 453 446 861 732 900 397 790 486 778 386 806 389 945 841 768 618 593 355 402 437 436 647 517 859 765 697 682 489 738 611 850 124 780 640 464 769 703 890 862 808 496 914 609 751 722 812 713 789 907 561 694 478 911 856 400 422 628 741 619 761 696 543 903 815 930 546 + + + + + $PROJ_DIR$\tx_misra.s + + + AARM + 749 + + + + + $PROJ_DIR$\tx_misra.c + + + ICCARM + 665 657 749 + + + BICOMP + 639 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 569 554 540 745 693 675 113 154 + + + BICOMP + 704 699 745 113 973 520 540 674 1000 154 735 675 569 584 554 693 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 818 + + + __cstat + 827 + + + BICOMP + 521 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 972 + + + BICOMP + 520 704 154 584 699 693 1000 972 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 947 + + + __cstat + 578 + + + BICOMP + 332 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 915 + + + BICOMP + 699 540 154 745 1000 915 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 419 + + + __cstat + 594 + + + BICOMP + 785 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 755 + + + __cstat + 572 + + + BICOMP + 460 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 860 + + + __cstat + 550 + + + BICOMP + 383 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 154 915 + + + BICOMP + 540 915 704 113 675 1000 154 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 867 + + + __cstat + 174 + + + BICOMP + 483 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 603 + + + __cstat + 560 + + + BICOMP + 883 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 990 + + + BICOMP + 699 973 540 154 745 1000 990 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 873 + + + __cstat + 729 + + + BICOMP + 854 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 626 + + + __cstat + 669 + + + BICOMP + 784 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 191 + + + BICOMP + 693 699 191 584 923 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 627 + + + __cstat + 621 + + + BICOMP + 507 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 745 915 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 912 + + + __cstat + 716 + + + BICOMP + 598 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 990 + + + BICOMP + 540 990 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 515 + + + __cstat + 557 + + + BICOMP + 547 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 745 915 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 811 + + + __cstat + 726 + + + BICOMP + 839 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 915 + + + BICOMP + 973 675 113 540 704 1000 915 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 504 + + + __cstat + 466 + + + BICOMP + 588 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 462 + + + __cstat + 739 + + + BICOMP + 689 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 990 + + + BICOMP + 675 113 540 704 1000 990 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 573 + + + __cstat + 403 + + + BICOMP + 467 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 915 + + + BICOMP + 745 915 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 848 + + + __cstat + 688 + + + BICOMP + 351 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 990 + + + BICOMP + 540 973 990 704 154 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 771 + + + __cstat + 725 + + + BICOMP + 880 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 968 + + + BICOMP + 540 704 154 675 1000 968 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 919 + + + __cstat + 581 + + + BICOMP + 817 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 960 + + + BICOMP + 699 960 540 154 745 1000 113 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 474 + + + __cstat + 868 + + + BICOMP + 498 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 663 + + + __cstat + 884 + + + BICOMP + 935 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 968 + + + BICOMP + 704 973 520 113 584 699 693 1000 968 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 544 + + + __cstat + 672 + + + BICOMP + 432 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 968 + + + BICOMP + 540 704 154 675 1000 968 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 549 + + + __cstat + 855 + + + BICOMP + 897 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 + + + BICOMP + 735 523 699 923 704 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 541 + + + __cstat + 821 + + + BICOMP + 488 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 972 + + + BICOMP + 704 972 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 720 + + + __cstat + 668 + + + BICOMP + 417 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 968 + + + BICOMP + 584 968 699 693 154 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 851 + + + __cstat + 711 + + + BICOMP + 905 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 968 + + + BICOMP + 584 968 699 693 154 973 520 704 1000 113 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 871 + + + __cstat + 568 + + + BICOMP + 499 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 915 + + + BICOMP + 540 915 704 154 973 675 1000 113 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 656 + + + __cstat + 714 + + + BICOMP + 740 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 923 113 915 + + + BICOMP + 704 915 520 923 584 699 693 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 814 + + + __cstat + 602 + + + BICOMP + 613 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 990 + + + BICOMP + 745 990 699 540 1000 973 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 728 + + + __cstat + 747 + + + BICOMP + 449 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 972 + + + BICOMP + 704 972 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 838 + + + __cstat + 708 + + + BICOMP + 512 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 923 113 191 120 960 990 915 972 968 + + + BICOMP + 120 699 972 540 154 113 990 973 745 1000 923 191 960 915 968 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 695 + + + __cstat + 870 + + + BICOMP + 477 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 788 + + + __cstat + 687 + + + BICOMP + 320 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 990 + + + BICOMP + 540 990 704 154 675 1000 113 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 476 + + + __cstat + 807 + + + BICOMP + 909 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 972 + + + BICOMP + 584 699 693 972 520 704 1000 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 752 + + + __cstat + 750 + + + BICOMP + 878 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 990 + + + BICOMP + 699 973 540 154 745 1000 990 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 843 + + + __cstat + 917 + + + BICOMP + 837 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 960 + + + BICOMP + 745 113 973 699 540 1000 960 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 537 + + + __cstat + 858 + + + BICOMP + 526 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 972 + + + BICOMP + 520 704 154 584 699 693 1000 972 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 447 + + + __cstat + 698 + + + BICOMP + 399 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 990 + + + BICOMP + 699 973 540 154 745 1000 990 584 520 704 693 735 675 523 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 570 + + + __cstat + 406 + + + BICOMP + 898 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 915 + + + BICOMP + 973 675 113 540 704 1000 915 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 810 + + + __cstat + 589 + + + BICOMP + 709 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 960 + + + BICOMP + 704 699 154 735 523 1000 960 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 749 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 895 + + + __cstat + 691 + + + BICOMP + 440 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 968 + + + BICOMP + 704 520 113 973 584 699 693 1000 968 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 712 + + + __cstat + 869 + + + BICOMP + 513 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 675 968 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 857 + + + __cstat + 902 + + + BICOMP + 844 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 972 + + + BICOMP + 523 699 973 735 113 704 1000 972 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 577 + + + __cstat + 758 + + + BICOMP + 563 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 675 968 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 770 + + + __cstat + 864 + + + BICOMP + 622 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 968 + + + BICOMP + 704 973 520 113 584 699 693 1000 968 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 875 + + + __cstat + 684 + + + BICOMP + 490 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 968 + + + BICOMP + 584 968 699 693 154 520 704 1000 113 973 745 540 735 675 523 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 763 + + + __cstat + 913 + + + BICOMP + 465 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 113 972 + + + BICOMP + 523 699 973 735 113 704 1000 972 675 540 745 584 520 693 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 587 + + + __cstat + 799 + + + BICOMP + 605 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 154 113 972 + + + BICOMP + 704 972 699 154 735 523 1000 113 973 675 540 745 584 520 693 + + + + + $PROJ_DIR$\..\src\tx_misra.s + + + AARM + 749 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 901 + + + __cstat + 746 + + + BICOMP + 904 + + + + + ICCARM + 1000 973 735 704 699 584 674 520 540 523 745 693 675 968 + + + BICOMP + 675 968 540 704 1000 973 735 523 699 745 584 520 693 + + + + + $PROJ_DIR$\tx_time_set.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_timer_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_time_slice.c + C-STAT + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + C-STAT + + + $PROJ_DIR$\tx_thread_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_preemption_change.c + C-STAT + + + $PROJ_DIR$\tx_thread_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_timeout.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_set.c + C-STAT + + + $PROJ_DIR$\txe_queue_delete.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_create.c + C-STAT + + + $PROJ_DIR$\tx_queue_info_get.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_put_notify.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + C-STAT + + + $PROJ_DIR$\tx_timer_create.c + C-STAT + + + $PROJ_DIR$\txe_thread_terminate.c + C-STAT + + + $PROJ_DIR$\tx_queue_receive.c + C-STAT + + + $PROJ_DIR$\tx_thread_time_slice_change.c + C-STAT + + + $PROJ_DIR$\tx_thread_identify.c + C-STAT + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + C-STAT + + + $PROJ_DIR$\tx_thread_relinquish.c + C-STAT + + + $PROJ_DIR$\txe_thread_suspend.c + C-STAT + + + $PROJ_DIR$\tx_thread_system_resume.c + C-STAT + + + $PROJ_DIR$\tx_queue_initialize.c + C-STAT + + + $PROJ_DIR$\tx_queue_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_thread_priority_change.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_initialize.c + C-STAT + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\txe_thread_time_slice_change.c + C-STAT + + + $PROJ_DIR$\tx_queue_send.c + C-STAT + + + $PROJ_DIR$\tx_thread_system_suspend.c + C-STAT + + + $PROJ_DIR$\txe_timer_change.c + C-STAT + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + C-STAT + + + $PROJ_DIR$\tx_queue_front_send.c + C-STAT + + + $PROJ_DIR$\tx_thread_wait_abort.c + C-STAT + + + $PROJ_DIR$\txe_timer_deactivate.c + C-STAT + + + $PROJ_DIR$\tx_queue_send_notify.c + C-STAT + + + $PROJ_DIR$\tx_thread_suspend.c + C-STAT + + + $PROJ_DIR$\tx_thread_sleep.c + C-STAT + + + $PROJ_DIR$\txe_thread_resume.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_get.c + C-STAT + + + $PROJ_DIR$\tx_queue_flush.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_put.c + C-STAT + + + $PROJ_DIR$\tx_thread_create.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_initialize.c + C-STAT + + + $PROJ_DIR$\tx_time_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_delete.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_timer_change.c + C-STAT + + + $PROJ_DIR$\txe_byte_allocate.c + C-STAT + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_delete.c + C-STAT + + + $PROJ_DIR$\txe_queue_send_notify.c + C-STAT + + + $PROJ_DIR$\tx_timer_deactivate.c + C-STAT + + + $PROJ_DIR$\tx_timer_system_deactivate.c + C-STAT + + + $PROJ_DIR$\txe_mutex_info_get.c + C-STAT + + + $PROJ_DIR$\txe_queue_front_send.c + C-STAT + + + $PROJ_DIR$\txe_queue_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_trace_enable.c + C-STAT + + + $PROJ_DIR$\txe_mutex_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + C-STAT + + + $PROJ_DIR$\tx_timer_activate.c + C-STAT + + + $PROJ_DIR$\tx_trace_interrupt_control.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_get.c + C-STAT + + + $PROJ_DIR$\tx_trace_initialize.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_create.c + C-STAT + + + $PROJ_DIR$\txe_queue_info_get.c + C-STAT + + + $PROJ_DIR$\txe_queue_send.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + C-STAT + + + $PROJ_DIR$\tx_timer_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_shell_entry.c + C-STAT + + + $PROJ_DIR$\tx_thread_reset.c + C-STAT + + + $PROJ_DIR$\tx_trace_user_event_insert.c + C-STAT + + + $PROJ_DIR$\tx_trace_event_filter.c + C-STAT + + + $PROJ_DIR$\tx_timer_initialize.c + C-STAT + + + $PROJ_DIR$\tx_timer_system_activate.c + C-STAT + + + $PROJ_DIR$\tx_trace_object_register.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_info_get.c + C-STAT + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_trace_object_unregister.c + C-STAT + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + C-STAT + + + $PROJ_DIR$\txe_queue_receive.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_put.c + C-STAT + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + C-STAT + + + $PROJ_DIR$\tx_thread_resume.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_create.c + C-STAT + + + $PROJ_DIR$\txe_block_allocate.c + C-STAT + + + $PROJ_DIR$\tx_thread_terminate.c + C-STAT + + + $PROJ_DIR$\tx_thread_stack_analyze.c + C-STAT + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + C-STAT + + + $PROJ_DIR$\tx_queue_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_delete.c + C-STAT + + + $PROJ_DIR$\tx_semaphore_delete.c + C-STAT + + + $PROJ_DIR$\tx_trace_event_unfilter.c + C-STAT + + + $PROJ_DIR$\txe_queue_create.c + C-STAT + + + $PROJ_DIR$\txe_timer_info_get.c + C-STAT + + + $PROJ_DIR$\tx_timer_expiration_process.c + C-STAT + + + $PROJ_DIR$\txe_thread_preemption_change.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_create.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_set_notify.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_delete.c + C-STAT + + + $PROJ_DIR$\txe_block_release.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_create.c + C-STAT + + + $PROJ_DIR$\txe_timer_create.c + C-STAT + + + $PROJ_DIR$\txe_byte_release.c + C-STAT + + + $PROJ_DIR$\txe_thread_relinquish.c + C-STAT + + + $PROJ_DIR$\txe_thread_wait_abort.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_info_get.c + C-STAT + + + $PROJ_DIR$\txe_thread_priority_change.c + C-STAT + + + $PROJ_DIR$\txe_block_pool_delete.c + C-STAT + + + $PROJ_DIR$\txe_mutex_create.c + C-STAT + + + $PROJ_DIR$\txe_mutex_put.c + C-STAT + + + $PROJ_DIR$\tx_timer_delete.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_get.c + C-STAT + + + $PROJ_DIR$\txe_timer_activate.c + C-STAT + + + $PROJ_DIR$\txe_queue_flush.c + C-STAT + + + $PROJ_DIR$\tx_timer_thread_entry.c + C-STAT + + + $PROJ_DIR$\tx_trace_disable.c + C-STAT + + + $PROJ_DIR$\txe_timer_delete.c + C-STAT + + + $PROJ_DIR$\txe_thread_create.c + C-STAT + + + $PROJ_DIR$\txe_thread_delete.c + C-STAT + + + $PROJ_DIR$\txe_mutex_delete.c + C-STAT + + + $PROJ_DIR$\txe_byte_pool_info_get.c + C-STAT + + + $PROJ_DIR$\txe_event_flags_info_get.c + C-STAT + + + $PROJ_DIR$\txe_thread_reset.c + C-STAT + + + $PROJ_DIR$\txe_mutex_get.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_prioritize.c + C-STAT + + + $PROJ_DIR$\txe_semaphore_put_notify.c + C-STAT + + + $PROJ_DIR$\txe_thread_info_get.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_delete.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_create.c + C-STAT + + + $PROJ_DIR$\tx_mutex_put.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_set_notify.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_initialize.c + C-STAT + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + C-STAT + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_set.c + C-STAT + + + $PROJ_DIR$\tx_mutex_initialize.c + C-STAT + + + $PROJ_DIR$\tx_mutex_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_mutex_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_get.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_info_get.c + C-STAT + + + $PROJ_DIR$\tx_queue_delete.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_create.c + C-STAT + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + C-STAT + + + $PROJ_DIR$\tx_block_release.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_delete.c + C-STAT + + + $PROJ_DIR$\tx_byte_release.c + C-STAT + + + $PROJ_DIR$\tx_mutex_get.c + C-STAT + + + $PROJ_DIR$\tx_iar.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_initialize_high_level.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_delete.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_initialize.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_create.c + C-STAT + + + $PROJ_DIR$\tx_queue_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_create.c + C-STAT + + + $PROJ_DIR$\tx_event_flags_info_get.c + C-STAT + + + $PROJ_DIR$\tx_mutex_priority_change.c + C-STAT + + + $PROJ_DIR$\tx_queue_create.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_search.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_cleanup.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_initialize.c + C-STAT + + + $PROJ_DIR$\tx_byte_allocate.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + C-STAT + + + $PROJ_DIR$\tx_block_allocate.c + C-STAT + + + $PROJ_DIR$\tx_block_pool_delete.c + C-STAT + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + C-STAT + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + ICCARM + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m3/iar/example_build/tx.ewd b/ports/cortex_m3/iar/example_build/tx.ewd new file mode 100644 index 00000000..b2b3f2fe --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m3/iar/example_build/tx.ewp b/ports/cortex_m3/iar/example_build/tx.ewp new file mode 100644 index 00000000..101935ef --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.ewp @@ -0,0 +1,2743 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m3/iar/example_build/tx.ewt b/ports/cortex_m3/iar/example_build/tx.ewt new file mode 100644 index 00000000..bfd5f907 --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx.ewt @@ -0,0 +1,3403 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m3/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m3/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..ab6a346c --- /dev/null +++ b/ports/cortex_m3/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,181 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 7200000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + ORR r1, r1, #1 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define SystTick Handler. */ +; + + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +SysTick_Handler: +__tx_SysTickHandler: +; VOID SysTickHandler (VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, lr} + BX LR +; } + + END + + diff --git a/ports/cortex_m3/iar/inc/tx_port.h b/ports/cortex_m3/iar/inc/tx_port.h new file mode 100644 index 00000000..538187c6 --- /dev/null +++ b/ports/cortex_m3/iar/inc/tx_port.h @@ -0,0 +1,375 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M3/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef signed int INT; +typedef unsigned int UINT; +typedef signed long LONG; +typedef unsigned long ULONG; +typedef signed short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024UL) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT)__CLZ(__RBIT((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M3/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + + diff --git a/ports/cortex_m3/iar/readme_threadx.txt b/ports/cortex_m3/iar/readme_threadx.txt new file mode 100644 index 00000000..22a46139 --- /dev/null +++ b/ports/cortex_m3/iar/readme_threadx.txt @@ -0,0 +1,158 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-M3 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-M3 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {lr} + + ; ISR processing goes here, including any needed function calls. + + POP {lr} + BX lr + + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-M3 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/iar/src/tx_iar.c b/ports/cortex_m3/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m3/iar/src/tx_misra.s b/ports/cortex_m3/iar/src/tx_misra.s new file mode 100644 index 00000000..62559a05 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_misra.s @@ -0,0 +1,1003 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** ThreadX MISRA Compliance */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + #define SHT_PROGBITS 0x1 + + EXTERN __aeabi_memset + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_interrupt_disable + EXTERN _tx_thread_interrupt_restore + EXTERN _tx_thread_stack_analyze + EXTERN _tx_thread_stack_error_handler + EXTERN _tx_thread_system_state +#ifdef TX_ENABLE_EVENT_TRACE + EXTERN _tx_trace_buffer_current_ptr + EXTERN _tx_trace_buffer_end_ptr + EXTERN _tx_trace_buffer_start_ptr + EXTERN _tx_trace_event_enable_bits + EXTERN _tx_trace_full_notify_function + EXTERN _tx_trace_header_ptr +#endif + + PUBLIC _tx_misra_always_true + PUBLIC _tx_misra_block_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_byte_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_char_to_uchar_pointer_convert + PUBLIC _tx_misra_const_char_to_char_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_entry_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_indirect_void_to_uchar_pointer_convert + PUBLIC _tx_misra_memset + PUBLIC _tx_misra_message_copy +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_object_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_pointer_to_ulong_convert + PUBLIC _tx_misra_status_get + PUBLIC _tx_misra_thread_stack_check +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_time_stamp_get +#endif + PUBLIC _tx_misra_timer_indirect_to_void_pointer_convert + PUBLIC _tx_misra_timer_pointer_add + PUBLIC _tx_misra_timer_pointer_dif +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_trace_event_insert +#endif + PUBLIC _tx_misra_uchar_pointer_add + PUBLIC _tx_misra_uchar_pointer_dif + PUBLIC _tx_misra_uchar_pointer_sub + PUBLIC _tx_misra_uchar_to_align_type_pointer_convert + PUBLIC _tx_misra_uchar_to_block_pool_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_entry_pointer_convert + PUBLIC _tx_misra_uchar_to_header_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_indirect_byte_pool_pointer_convert + PUBLIC _tx_misra_uchar_to_indirect_uchar_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_object_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_void_pointer_convert + PUBLIC _tx_misra_ulong_pointer_add + PUBLIC _tx_misra_ulong_pointer_dif + PUBLIC _tx_misra_ulong_pointer_sub + PUBLIC _tx_misra_ulong_to_pointer_convert + PUBLIC _tx_misra_ulong_to_thread_pointer_convert + PUBLIC _tx_misra_user_timer_pointer_get + PUBLIC _tx_misra_void_to_block_pool_pointer_convert + PUBLIC _tx_misra_void_to_byte_pool_pointer_convert + PUBLIC _tx_misra_void_to_event_flags_pointer_convert + PUBLIC _tx_misra_void_to_indirect_uchar_pointer_convert + PUBLIC _tx_misra_void_to_mutex_pointer_convert + PUBLIC _tx_misra_void_to_queue_pointer_convert + PUBLIC _tx_misra_void_to_semaphore_pointer_convert + PUBLIC _tx_misra_void_to_thread_pointer_convert + PUBLIC _tx_misra_void_to_uchar_pointer_convert + PUBLIC _tx_misra_void_to_ulong_pointer_convert + PUBLIC _tx_misra_ipsr_get + PUBLIC _tx_version_id + + + SECTION `.data`:DATA:REORDER:NOROOT(2) + DATA +// 51 CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.0 MISRA C Compliant *"; +_tx_version_id: + DC8 43H, 6FH, 70H, 79H, 72H, 69H, 67H, 68H + DC8 74H, 20H, 28H, 63H, 29H, 20H, 31H, 39H + DC8 39H, 36H, 2DH, 32H, 30H, 31H, 38H, 20H + DC8 45H, 78H, 70H, 72H, 65H, 73H, 73H, 20H + DC8 4CH, 6FH, 67H, 69H, 63H, 20H, 49H, 6EH + DC8 63H, 2EH, 20H, 2AH, 20H, 54H, 68H, 72H + DC8 65H, 61H, 64H, 58H, 20H, 35H, 2EH, 38H + DC8 20H, 4DH, 49H, 53H, 52H, 41H, 20H, 43H + DC8 20H, 43H, 6FH, 6DH, 70H, 6CH, 69H, 61H + DC8 6EH, 74H, 20H, 2AH, 0 + DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_memset: + PUSH {R4,LR} + MOVS R4,R0 + MOVS R0,R2 + MOVS R2,R1 + MOVS R1,R0 + MOVS R0,R4 + BL __aeabi_memset + POP {R4,PC} ;; return + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_add: + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_sub: + RSBS R1,R1,#+0 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_dif: + SUBS R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_pointer_to_ulong_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_sub: + MVNS R2,#+3 + MULS R1,R2,R1 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ +/** UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_message_copy: + PUSH {R4,R5} + LDR R3,[R0, #+0] + LDR R4,[R1, #+0] + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + CMP R2,#+2 + BCC.N ??_tx_misra_message_copy_0 + SUBS R2,R2,#+1 + B.N ??_tx_misra_message_copy_1 +??_tx_misra_message_copy_2: + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + SUBS R2,R2,#+1 +??_tx_misra_message_copy_1: + CMP R2,#+0 + BNE.N ??_tx_misra_message_copy_2 +??_tx_misra_message_copy_0: + STR R3,[R0, #+0] + STR R4,[R1, #+0] + POP {R4,R5} + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ +/** TX_TIMER_INTERNAL **ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ +/** **ptr1, ULONG size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ +/** *internal_timer, TX_TIMER **user_timer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_user_timer_pointer_get: + ADDS R2,R0,#+8 + SUBS R2,R2,R0 + RSBS R2,R2,#+0 + ADD R0,R0,R2 + STR R0,[R1, #+0] + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ +/** VOID **highest_stack); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_thread_stack_check: + PUSH {R3-R5,LR} + MOVS R4,R0 + MOVS R5,R1 + BL _tx_thread_interrupt_disable + CMP R4,#+0 + BEQ.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+0] + LDR.N R2,??DataTable2 ;; 0x54485244 + CMP R1,R2 + BNE.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+8] + LDR R2,[R5, #+0] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_1 + LDR R1,[R4, #+8] + STR R1,[R5, #+0] +??_tx_misra_thread_stack_check_1: + LDR R1,[R4, #+12] + LDR R1,[R1, #+0] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R4, #+16] + LDR R1,[R1, #+1] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R5, #+0] + LDR R2,[R4, #+12] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_3 +??_tx_misra_thread_stack_check_2: + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_error_handler + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_3: + LDR R1,[R5, #+0] + LDR R1,[R1, #-4] + CMP R1,#-269488145 + BEQ.N ??_tx_misra_thread_stack_check_0 + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_analyze + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_0: + BL _tx_thread_interrupt_restore + POP {R0,R4,R5,PC} ;; return + +#ifdef TX_ENABLE_EVENT_TRACE + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_trace_event_insert(ULONG event_id, */ +/** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ +/** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_trace_event_insert: + PUSH {R3-R7,LR} + LDR.N R4,??DataTable2_1 + LDR R4,[R4, #+0] + CMP R4,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_2 + LDR R5,[R5, #+0] + LDR R6,[SP, #+28] + TST R5,R6 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_3 + LDR R5,[R5, #+0] + LDR.N R6,??DataTable2_4 + LDR R6,[R6, #+0] + CMP R5,#+0 + BNE.N ??_tx_misra_trace_event_insert_1 + LDR R5,[R6, #+44] + LDR R7,[R6, #+60] + LSLS R7,R7,#+16 + ORRS R7,R7,#0x80000000 + ORRS R5,R7,R5 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_1: + CMP R5,#-252645136 + BCS.N ??_tx_misra_trace_event_insert_3 + MOVS R5,R6 + MOVS R6,#-1 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_3: + MOVS R6,#-252645136 + MOVS R5,#+0 +??_tx_misra_trace_event_insert_2: + STR R6,[R4, #+0] + STR R5,[R4, #+4] + STR R0,[R4, #+8] + LDR R0,[SP, #+32] + STR R0,[R4, #+12] + STR R1,[R4, #+16] + STR R2,[R4, #+20] + STR R3,[R4, #+24] + LDR R0,[SP, #+24] + STR R0,[R4, #+28] + ADDS R4,R4,#+32 + LDR.N R0,??DataTable2_5 + LDR R0,[R0, #+0] + CMP R4,R0 + BCC.N ??_tx_misra_trace_event_insert_4 + LDR.N R0,??DataTable2_6 + LDR R4,[R0, #+0] + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] + LDR.N R0,??DataTable2_8 + LDR R0,[R0, #+0] + CMP R0,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + LDR.N R1,??DataTable2_8 + LDR R1,[R1, #+0] + BLX R1 + B.N ??_tx_misra_trace_event_insert_0 +??_tx_misra_trace_event_insert_4: + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] +??_tx_misra_trace_event_insert_0: + POP {R0,R4-R7,PC} ;; return + + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_1: + DC32 _tx_trace_buffer_current_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_2: + DC32 _tx_trace_event_enable_bits + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_5: + DC32 _tx_trace_buffer_end_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_6: + DC32 _tx_trace_buffer_start_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_7: + DC32 _tx_trace_header_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_8: + DC32 _tx_trace_full_notify_function + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_time_stamp_get(VOID); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_time_stamp_get: + MOVS R0,#+0 + BX LR ;; return + +#endif + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2: + DC32 0x54485244 + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_3: + DC32 _tx_thread_system_state + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_4: + DC32 _tx_thread_current_ptr + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_always_true(void); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_always_true: + MOVS R0,#+1 + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_indirect_void_to_uchar_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************/ +/***********************************************************************************/ +/** */ +/** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ +/** */ +/***********************************************************************************/ +/***********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_block_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_block_pool_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************/ +/************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************/ +/************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_block_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************/ +/**************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************/ +/**************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_byte_pool_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_byte_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_align_type_pointer_convert: + BX LR ;; return + + +/****************************************************************************************************/ +/****************************************************************************************************/ +/** */ +/** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/****************************************************************************************************/ +/****************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_byte_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************************/ +/**************************************************************************************************/ +/** */ +/** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************************/ +/**************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_event_flags_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_ulong_pointer_convert: + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_mutex_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_status_get(UINT status); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_status_get: + MOVS R0,#+0 + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_queue_pointer_convert: + BX LR ;; return + + +/****************************************************************************************/ +/****************************************************************************************/ +/** */ +/** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ +/** */ +/****************************************************************************************/ +/****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_semaphore_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_void_pointer_convert: + BX LR ;; return + + +/*********************************************************************************/ +/*********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ +/** */ +/*********************************************************************************/ +/*********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_thread_pointer_convert: + BX LR ;; return + + +/***************************************************************************************************/ +/***************************************************************************************************/ +/** */ +/** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ +/** */ +/***************************************************************************************************/ +/***************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_indirect_to_void_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_const_char_to_char_pointer_convert: + BX LR ;; return + + +/**********************************************************************************/ +/**********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ +/** */ +/**********************************************************************************/ +/**********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_thread_pointer_convert: + BX LR ;; return + + +#ifdef TX_ENABLE_EVENT_TRACE + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_object_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_object_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_header_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_entry_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_entry_to_uchar_pointer_convert: + BX LR ;; return +#endif + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_char_to_uchar_pointer_convert: + BX LR ;; return + + +***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_ipsr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ipsr_get: + MRS R0, IPSR + BX LR ;; return + + + SECTION `.iar_vfe_header`:DATA:NOALLOC:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA + DC32 0 + + END diff --git a/ports/cortex_m3/iar/src/tx_thread_context_restore.s b/ports/cortex_m3/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..e3e42286 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_context_restore.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* [_tx_execution_isr_exit] Execution profiling ISR exit */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr +#endif +; + POP {lr} + BX lr +; +;} + END diff --git a/ports/cortex_m3/iar/src/tx_thread_context_save.s b/ports/cortex_m3/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..49e11d68 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_context_save.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* [_tx_execution_isr_enter] Execution profiling ISR enter */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover return address +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m3/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..d956fd6d --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..38a2083d --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..356c8aac --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m3/iar/src/tx_thread_schedule.s b/ports/cortex_m3/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..aa5f7764 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_schedule.s @@ -0,0 +1,250 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context PendSV handler. */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts +#endif + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_stack_build.s b/ports/cortex_m3/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..96526cc1 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_stack_build.s @@ -0,0 +1,144 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_thread_system_return.s b/ports/cortex_m3/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..fa0ef7a3 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_thread_system_return.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/iar/src/tx_timer_interrupt.s b/ports/cortex_m3/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..94af5d87 --- /dev/null +++ b/ports/cortex_m3/iar/src/tx_timer_interrupt.s @@ -0,0 +1,268 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M3/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* expiration functions are called. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired: +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt new file mode 100644 index 00000000..5fcedc85 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvopt @@ -0,0 +1,300 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Demo + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(152=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T5F + + + 0 + UL2CM3 + -UV0289BJE -O14 -S0 -C0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_16 -FS00 -FL04000 + + + + + + 0 + 1 + thread_0_counter + + + 1 + 1 + thread_1_counter + + + 2 + 1 + thread_2_counter + + + 3 + 1 + thread_3_counter + + + 4 + 1 + thread_4_counter + + + 5 + 1 + thread_5_counter + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + .\tx_initialize_low_level.s + tx_initialize_low_level.s + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\sample_threadx.c + sample_threadx.c + 0 + 0 + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 56 + 12 + 1633 + 671 + + + + + + + Library_Group + 0 + 0 + 0 + 0 + + 2 + 3 + 4 + 0 + 0 + 0 + .\ThreadX_Library.lib + ThreadX_Library.lib + 0 + 0 + + + +
diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj new file mode 100644 index 00000000..3847190f --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Demo.uvproj @@ -0,0 +1,573 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Demo + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M3 + ARM + CLOCK(12000000) CPUTYPE("Cortex-M3") ESEL ELITTLE + + + + 4349 + + + + + + + + + + + + 0 + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\ + ThreadX_Demo + 1 + 0 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 0 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ../inc;../../../../common/inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0x00000000 + 0x20000000 + + + + + --first __tx_vectors --entry=__main + + + + + + + + Source Group + + + 0 + 1 + 1 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 0 + + + + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + tx_initialize_low_level.s + 2 + .\tx_initialize_low_level.s + + + 2 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + sample_threadx.c + 1 + .\sample_threadx.c + + + + + Library_Group + + + ThreadX_Library.lib + 4 + .\ThreadX_Library.lib + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Library.plg b/ports/cortex_m3/keil/example_build/ThreadX_Library.plg new file mode 100644 index 00000000..6b87c5cf --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Library.plg @@ -0,0 +1,9 @@ + + +
+

µVision Build Log

+

Project:

+C:\threadx\cortex-m3\keil\ThreadX_Library.uvproj +Project File Date: 07/19/2012 + +

Output:

diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt new file mode 100644 index 00000000..ac554f54 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvopt @@ -0,0 +1,2664 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Library_Project + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + -UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_16 -FS00 -FL04000 + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_disable.s + tx_thread_interrupt_disable.s + 0 + 0 + + + 1 + 2 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_control.s + tx_thread_interrupt_control.s + 0 + 0 + + + 1 + 3 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_restore.s + tx_thread_context_restore.s + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_save.s + tx_thread_context_save.s + 0 + 0 + + + 1 + 5 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_restore.s + tx_thread_interrupt_restore.s + 0 + 0 + + + 1 + 6 + 2 + 0 + 0 + 0 + ..\src\tx_thread_schedule.s + tx_thread_schedule.s + 0 + 0 + + + 1 + 7 + 2 + 0 + 0 + 0 + ..\src\tx_thread_stack_build.s + tx_thread_stack_build.s + 0 + 0 + + + 1 + 8 + 2 + 0 + 0 + 0 + ..\src\tx_thread_system_return.s + tx_thread_system_return.s + 0 + 0 + + + 1 + 9 + 2 + 0 + 0 + 0 + ..\src\tx_timer_interrupt.s + tx_timer_interrupt.s + 0 + 0 + + + 1 + 10 + 5 + 0 + 0 + 0 + ..\inc\tx_port.h + tx_port.h + 0 + 0 + + + 1 + 11 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_api.h + tx_api.h + 0 + 0 + + + 1 + 12 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_block_pool.h + tx_block_pool.h + 0 + 0 + + + 1 + 13 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_byte_pool.h + tx_byte_pool.h + 0 + 0 + + + 1 + 14 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_event_flags.h + tx_event_flags.h + 0 + 0 + + + 1 + 15 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_initialize.h + tx_initialize.h + 0 + 0 + + + 1 + 16 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_mutex.h + tx_mutex.h + 0 + 0 + + + 1 + 17 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_queue.h + tx_queue.h + 0 + 0 + + + 1 + 18 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_semaphore.h + tx_semaphore.h + 0 + 0 + + + 1 + 19 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_thread.h + tx_thread.h + 0 + 0 + + + 1 + 20 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_timer.h + tx_timer.h + 0 + 0 + + + 1 + 21 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_trace.h + tx_trace.h + 0 + 0 + + + 1 + 22 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_user.h + tx_user.h + 0 + 0 + + + 1 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_allocate.c + tx_block_allocate.c + 0 + 0 + + + 1 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + tx_block_pool_cleanup.c + 0 + 0 + + + 1 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_create.c + tx_block_pool_create.c + 0 + 0 + + + 1 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_delete.c + tx_block_pool_delete.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_info_get.c + tx_block_pool_info_get.c + 0 + 0 + + + 1 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_initialize.c + tx_block_pool_initialize.c + 0 + 0 + + + 1 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + tx_block_pool_performance_info_get.c + 0 + 0 + + + 1 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + tx_block_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + tx_block_pool_prioritize.c + 0 + 0 + + + 1 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_release.c + tx_block_release.c + 0 + 0 + + + 1 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_allocate.c + tx_byte_allocate.c + 0 + 0 + + + 1 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + tx_byte_pool_cleanup.c + 0 + 0 + + + 1 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_create.c + tx_byte_pool_create.c + 0 + 0 + + + 1 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_delete.c + tx_byte_pool_delete.c + 0 + 0 + + + 1 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + tx_byte_pool_info_get.c + 0 + 0 + + + 1 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + tx_byte_pool_initialize.c + 0 + 0 + + + 1 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + tx_byte_pool_performance_info_get.c + 0 + 0 + + + 1 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + tx_byte_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + tx_byte_pool_prioritize.c + 0 + 0 + + + 1 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_search.c + tx_byte_pool_search.c + 0 + 0 + + + 1 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_release.c + tx_byte_release.c + 0 + 0 + + + 1 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + tx_event_flags_cleanup.c + 0 + 0 + + + 1 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_create.c + tx_event_flags_create.c + 0 + 0 + + + 1 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_delete.c + tx_event_flags_delete.c + 0 + 0 + + + 1 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_get.c + tx_event_flags_get.c + 0 + 0 + + + 1 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_info_get.c + tx_event_flags_info_get.c + 0 + 0 + + + 1 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_initialize.c + tx_event_flags_initialize.c + 0 + 0 + + + 1 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + tx_event_flags_performance_info_get.c + 0 + 0 + + + 1 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + tx_event_flags_performance_system_info_get.c + 0 + 0 + + + 1 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set.c + tx_event_flags_set.c + 0 + 0 + + + 1 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + tx_event_flags_set_notify.c + 0 + 0 + + + 1 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_high_level.c + tx_initialize_high_level.c + 0 + 0 + + + 1 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + tx_initialize_kernel_enter.c + 0 + 0 + + + 1 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + tx_initialize_kernel_setup.c + 0 + 0 + + + 1 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_misra.c + tx_misra.c + 0 + 0 + + + 1 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_cleanup.c + tx_mutex_cleanup.c + 0 + 0 + + + 1 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_create.c + tx_mutex_create.c + 0 + 0 + + + 1 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_delete.c + tx_mutex_delete.c + 0 + 0 + + + 1 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_get.c + tx_mutex_get.c + 0 + 0 + + + 1 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_info_get.c + tx_mutex_info_get.c + 0 + 0 + + + 1 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_initialize.c + tx_mutex_initialize.c + 0 + 0 + + + 1 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + tx_mutex_performance_info_get.c + 0 + 0 + + + 1 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + tx_mutex_performance_system_info_get.c + 0 + 0 + + + 1 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_prioritize.c + tx_mutex_prioritize.c + 0 + 0 + + + 1 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_priority_change.c + tx_mutex_priority_change.c + 0 + 0 + + + 1 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_put.c + tx_mutex_put.c + 0 + 0 + + + 1 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_cleanup.c + tx_queue_cleanup.c + 0 + 0 + + + 1 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_create.c + tx_queue_create.c + 0 + 0 + + + 1 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_delete.c + tx_queue_delete.c + 0 + 0 + + + 1 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_flush.c + tx_queue_flush.c + 0 + 0 + + + 1 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_front_send.c + tx_queue_front_send.c + 0 + 0 + + + 1 + 74 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_info_get.c + tx_queue_info_get.c + 0 + 0 + + + 1 + 75 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_initialize.c + tx_queue_initialize.c + 0 + 0 + + + 1 + 76 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + tx_queue_performance_info_get.c + 0 + 0 + + + 1 + 77 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + tx_queue_performance_system_info_get.c + 0 + 0 + + + 1 + 78 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_prioritize.c + tx_queue_prioritize.c + 0 + 0 + + + 1 + 79 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_receive.c + tx_queue_receive.c + 0 + 0 + + + 1 + 80 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send.c + tx_queue_send.c + 0 + 0 + + + 1 + 81 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send_notify.c + tx_queue_send_notify.c + 0 + 0 + + + 1 + 82 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + tx_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 83 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + tx_semaphore_cleanup.c + 0 + 0 + + + 1 + 84 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_create.c + tx_semaphore_create.c + 0 + 0 + + + 1 + 85 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_delete.c + tx_semaphore_delete.c + 0 + 0 + + + 1 + 86 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_get.c + tx_semaphore_get.c + 0 + 0 + + + 1 + 87 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_info_get.c + tx_semaphore_info_get.c + 0 + 0 + + + 1 + 88 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_initialize.c + tx_semaphore_initialize.c + 0 + 0 + + + 1 + 89 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + tx_semaphore_performance_info_get.c + 0 + 0 + + + 1 + 90 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + tx_semaphore_performance_system_info_get.c + 0 + 0 + + + 1 + 91 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + tx_semaphore_prioritize.c + 0 + 0 + + + 1 + 92 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put.c + tx_semaphore_put.c + 0 + 0 + + + 1 + 93 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + tx_semaphore_put_notify.c + 0 + 0 + + + 1 + 94 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_create.c + tx_thread_create.c + 0 + 0 + + + 1 + 95 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_delete.c + tx_thread_delete.c + 0 + 0 + + + 1 + 96 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + tx_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 97 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_identify.c + tx_thread_identify.c + 0 + 0 + + + 1 + 98 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_info_get.c + tx_thread_info_get.c + 0 + 0 + + + 1 + 99 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_initialize.c + tx_thread_initialize.c + 0 + 0 + + + 1 + 100 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + tx_thread_performance_info_get.c + 0 + 0 + + + 1 + 101 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + tx_thread_performance_system_info_get.c + 0 + 0 + + + 1 + 102 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_preemption_change.c + tx_thread_preemption_change.c + 0 + 0 + + + 1 + 103 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_priority_change.c + tx_thread_priority_change.c + 0 + 0 + + + 1 + 104 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_relinquish.c + tx_thread_relinquish.c + 0 + 0 + + + 1 + 105 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_reset.c + tx_thread_reset.c + 0 + 0 + + + 1 + 106 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_resume.c + tx_thread_resume.c + 0 + 0 + + + 1 + 107 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_shell_entry.c + tx_thread_shell_entry.c + 0 + 0 + + + 1 + 108 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_sleep.c + tx_thread_sleep.c + 0 + 0 + + + 1 + 109 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + tx_thread_stack_analyze.c + 0 + 0 + + + 1 + 110 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + tx_thread_stack_error_handler.c + 0 + 0 + + + 1 + 111 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + tx_thread_stack_error_notify.c + 0 + 0 + + + 1 + 112 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_suspend.c + tx_thread_suspend.c + 0 + 0 + + + 1 + 113 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + tx_thread_system_preempt_check.c + 0 + 0 + + + 1 + 114 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_resume.c + tx_thread_system_resume.c + 0 + 0 + + + 1 + 115 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_suspend.c + tx_thread_system_suspend.c + 0 + 0 + + + 1 + 116 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_terminate.c + tx_thread_terminate.c + 0 + 0 + + + 1 + 117 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice.c + tx_thread_time_slice.c + 0 + 0 + + + 1 + 118 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + tx_thread_time_slice_change.c + 0 + 0 + + + 1 + 119 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_timeout.c + tx_thread_timeout.c + 0 + 0 + + + 1 + 120 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_wait_abort.c + tx_thread_wait_abort.c + 0 + 0 + + + 1 + 121 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_get.c + tx_time_get.c + 0 + 0 + + + 1 + 122 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_set.c + tx_time_set.c + 0 + 0 + + + 1 + 123 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_activate.c + tx_timer_activate.c + 0 + 0 + + + 1 + 124 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_change.c + tx_timer_change.c + 0 + 0 + + + 1 + 125 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_create.c + tx_timer_create.c + 0 + 0 + + + 1 + 126 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_deactivate.c + tx_timer_deactivate.c + 0 + 0 + + + 1 + 127 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_delete.c + tx_timer_delete.c + 0 + 0 + + + 1 + 128 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_expiration_process.c + tx_timer_expiration_process.c + 0 + 0 + + + 1 + 129 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_info_get.c + tx_timer_info_get.c + 0 + 0 + + + 1 + 130 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_initialize.c + tx_timer_initialize.c + 0 + 0 + + + 1 + 131 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + tx_timer_performance_info_get.c + 0 + 0 + + + 1 + 132 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + tx_timer_performance_system_info_get.c + 0 + 0 + + + 1 + 133 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_activate.c + tx_timer_system_activate.c + 0 + 0 + + + 1 + 134 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + tx_timer_system_deactivate.c + 0 + 0 + + + 1 + 135 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_thread_entry.c + tx_timer_thread_entry.c + 0 + 0 + + + 1 + 136 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + tx_trace_buffer_full_notify.c + 0 + 0 + + + 1 + 137 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_disable.c + tx_trace_disable.c + 0 + 0 + + + 1 + 138 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_enable.c + tx_trace_enable.c + 0 + 0 + + + 1 + 139 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_filter.c + tx_trace_event_filter.c + 0 + 0 + + + 1 + 140 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + tx_trace_event_unfilter.c + 0 + 0 + + + 1 + 141 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_initialize.c + tx_trace_initialize.c + 0 + 0 + + + 1 + 142 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + tx_trace_interrupt_control.c + 0 + 0 + + + 1 + 143 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + tx_trace_isr_enter_insert.c + 0 + 0 + + + 1 + 144 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + tx_trace_isr_exit_insert.c + 0 + 0 + + + 1 + 145 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_register.c + tx_trace_object_register.c + 0 + 0 + + + 1 + 146 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_unregister.c + tx_trace_object_unregister.c + 0 + 0 + + + 1 + 147 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + tx_trace_user_event_insert.c + 0 + 0 + + + 1 + 148 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_allocate.c + txe_block_allocate.c + 0 + 0 + + + 1 + 149 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_create.c + txe_block_pool_create.c + 0 + 0 + + + 1 + 150 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_delete.c + txe_block_pool_delete.c + 0 + 0 + + + 1 + 151 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_info_get.c + txe_block_pool_info_get.c + 0 + 0 + + + 1 + 152 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + txe_block_pool_prioritize.c + 0 + 0 + + + 1 + 153 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_release.c + txe_block_release.c + 0 + 0 + + + 1 + 154 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_allocate.c + txe_byte_allocate.c + 0 + 0 + + + 1 + 155 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_create.c + txe_byte_pool_create.c + 0 + 0 + + + 1 + 156 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_delete.c + txe_byte_pool_delete.c + 0 + 0 + + + 1 + 157 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + txe_byte_pool_info_get.c + 0 + 0 + + + 1 + 158 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + txe_byte_pool_prioritize.c + 0 + 0 + + + 1 + 159 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_release.c + txe_byte_release.c + 0 + 0 + + + 1 + 160 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_create.c + txe_event_flags_create.c + 0 + 0 + + + 1 + 161 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_delete.c + txe_event_flags_delete.c + 0 + 0 + + + 1 + 162 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_get.c + txe_event_flags_get.c + 0 + 0 + + + 1 + 163 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_info_get.c + txe_event_flags_info_get.c + 0 + 0 + + + 1 + 164 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set.c + txe_event_flags_set.c + 0 + 0 + + + 1 + 165 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + txe_event_flags_set_notify.c + 0 + 0 + + + 1 + 166 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_create.c + txe_mutex_create.c + 0 + 0 + + + 1 + 167 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_delete.c + txe_mutex_delete.c + 0 + 0 + + + 1 + 168 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_get.c + txe_mutex_get.c + 0 + 0 + + + 1 + 169 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_info_get.c + txe_mutex_info_get.c + 0 + 0 + + + 1 + 170 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_prioritize.c + txe_mutex_prioritize.c + 0 + 0 + + + 1 + 171 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_put.c + txe_mutex_put.c + 0 + 0 + + + 1 + 172 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_create.c + txe_queue_create.c + 0 + 0 + + + 1 + 173 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_delete.c + txe_queue_delete.c + 0 + 0 + + + 1 + 174 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_flush.c + txe_queue_flush.c + 0 + 0 + + + 1 + 175 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_front_send.c + txe_queue_front_send.c + 0 + 0 + + + 1 + 176 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_info_get.c + txe_queue_info_get.c + 0 + 0 + + + 1 + 177 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_prioritize.c + txe_queue_prioritize.c + 0 + 0 + + + 1 + 178 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_receive.c + txe_queue_receive.c + 0 + 0 + + + 1 + 179 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send.c + txe_queue_send.c + 0 + 0 + + + 1 + 180 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send_notify.c + txe_queue_send_notify.c + 0 + 0 + + + 1 + 181 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + txe_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 182 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_create.c + txe_semaphore_create.c + 0 + 0 + + + 1 + 183 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_delete.c + txe_semaphore_delete.c + 0 + 0 + + + 1 + 184 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_get.c + txe_semaphore_get.c + 0 + 0 + + + 1 + 185 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_info_get.c + txe_semaphore_info_get.c + 0 + 0 + + + 1 + 186 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + txe_semaphore_prioritize.c + 0 + 0 + + + 1 + 187 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put.c + txe_semaphore_put.c + 0 + 0 + + + 1 + 188 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + txe_semaphore_put_notify.c + 0 + 0 + + + 1 + 189 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_create.c + txe_thread_create.c + 0 + 0 + + + 1 + 190 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_delete.c + txe_thread_delete.c + 0 + 0 + + + 1 + 191 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + txe_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 192 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_info_get.c + txe_thread_info_get.c + 0 + 0 + + + 1 + 193 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_preemption_change.c + txe_thread_preemption_change.c + 0 + 0 + + + 1 + 194 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_priority_change.c + txe_thread_priority_change.c + 0 + 0 + + + 1 + 195 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_relinquish.c + txe_thread_relinquish.c + 0 + 0 + + + 1 + 196 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_reset.c + txe_thread_reset.c + 0 + 0 + + + 1 + 197 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_resume.c + txe_thread_resume.c + 0 + 0 + + + 1 + 198 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_suspend.c + txe_thread_suspend.c + 0 + 0 + + + 1 + 199 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_terminate.c + txe_thread_terminate.c + 0 + 0 + + + 1 + 200 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + txe_thread_time_slice_change.c + 0 + 0 + + + 1 + 201 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_wait_abort.c + txe_thread_wait_abort.c + 0 + 0 + + + 1 + 202 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_activate.c + txe_timer_activate.c + 0 + 0 + + + 1 + 203 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_change.c + txe_timer_change.c + 0 + 0 + + + 1 + 204 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_create.c + txe_timer_create.c + 0 + 0 + + + 1 + 205 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_deactivate.c + txe_timer_deactivate.c + 0 + 0 + + + 1 + 206 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_delete.c + txe_timer_delete.c + 0 + 0 + + + 1 + 207 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_info_get.c + txe_timer_info_get.c + 0 + 0 + + + +
diff --git a/ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj new file mode 100644 index 00000000..222522d0 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/ThreadX_Library.uvproj @@ -0,0 +1,1550 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Library_Project + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M3 + ARM + CLOCK(12000000) CPUTYPE("Cortex-M3") ESEL ELITTLE + + + + 4349 + + + + + + + + + + + + 0 + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\ + ThreadX_Library + 0 + 1 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 1 + + + + + + + + + + + + + + BIN\UL2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 1 + + 0 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1000 + + + 1 + 0x0 + 0x4000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + noTX_ENABLE_EXECUTION_CHANGE_NOTIFY + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Group + + + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + ../inc;../../../../common/inc + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + tx_thread_interrupt_disable.s + 2 + ..\src\tx_thread_interrupt_disable.s + + + tx_thread_interrupt_control.s + 2 + ..\src\tx_thread_interrupt_control.s + + + tx_thread_context_restore.s + 2 + ..\src\tx_thread_context_restore.s + + + tx_thread_context_save.s + 2 + ..\src\tx_thread_context_save.s + + + tx_thread_interrupt_restore.s + 2 + ..\src\tx_thread_interrupt_restore.s + + + tx_thread_schedule.s + 2 + ..\src\tx_thread_schedule.s + + + tx_thread_stack_build.s + 2 + ..\src\tx_thread_stack_build.s + + + tx_thread_system_return.s + 2 + ..\src\tx_thread_system_return.s + + + tx_timer_interrupt.s + 2 + ..\src\tx_timer_interrupt.s + + + tx_port.h + 5 + ..\inc\tx_port.h + + + tx_api.h + 5 + ..\..\..\..\common\inc\tx_api.h + + + tx_block_pool.h + 5 + ..\..\..\..\common\inc\tx_block_pool.h + + + tx_byte_pool.h + 5 + ..\..\..\..\common\inc\tx_byte_pool.h + + + tx_event_flags.h + 5 + ..\..\..\..\common\inc\tx_event_flags.h + + + tx_initialize.h + 5 + ..\..\..\..\common\inc\tx_initialize.h + + + tx_mutex.h + 5 + ..\..\..\..\common\inc\tx_mutex.h + + + tx_queue.h + 5 + ..\..\..\..\common\inc\tx_queue.h + + + tx_semaphore.h + 5 + ..\..\..\..\common\inc\tx_semaphore.h + + + tx_thread.h + 5 + ..\..\..\..\common\inc\tx_thread.h + + + tx_timer.h + 5 + ..\..\..\..\common\inc\tx_timer.h + + + tx_trace.h + 5 + ..\..\..\..\common\inc\tx_trace.h + + + tx_user.h + 5 + ..\..\..\..\common\inc\tx_user.h + + + tx_block_allocate.c + 1 + ..\..\..\..\common\src\tx_block_allocate.c + + + tx_block_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + + + tx_block_pool_create.c + 1 + ..\..\..\..\common\src\tx_block_pool_create.c + + + tx_block_pool_delete.c + 1 + ..\..\..\..\common\src\tx_block_pool_delete.c + + + tx_block_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_info_get.c + + + tx_block_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_block_pool_initialize.c + + + tx_block_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + tx_block_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + tx_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + + + tx_block_release.c + 1 + ..\..\..\..\common\src\tx_block_release.c + + + tx_byte_allocate.c + 1 + ..\..\..\..\common\src\tx_byte_allocate.c + + + tx_byte_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + tx_byte_pool_create.c + 1 + ..\..\..\..\common\src\tx_byte_pool_create.c + + + tx_byte_pool_delete.c + 1 + ..\..\..\..\common\src\tx_byte_pool_delete.c + + + tx_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + + + tx_byte_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + + + tx_byte_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + tx_byte_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + tx_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + tx_byte_pool_search.c + 1 + ..\..\..\..\common\src\tx_byte_pool_search.c + + + tx_byte_release.c + 1 + ..\..\..\..\common\src\tx_byte_release.c + + + tx_event_flags_cleanup.c + 1 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + + + tx_event_flags_create.c + 1 + ..\..\..\..\common\src\tx_event_flags_create.c + + + tx_event_flags_delete.c + 1 + ..\..\..\..\common\src\tx_event_flags_delete.c + + + tx_event_flags_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_get.c + + + tx_event_flags_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_info_get.c + + + tx_event_flags_initialize.c + 1 + ..\..\..\..\common\src\tx_event_flags_initialize.c + + + tx_event_flags_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + tx_event_flags_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + tx_event_flags_set.c + 1 + ..\..\..\..\common\src\tx_event_flags_set.c + + + tx_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + + + tx_initialize_high_level.c + 1 + ..\..\..\..\common\src\tx_initialize_high_level.c + + + tx_initialize_kernel_enter.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + tx_initialize_kernel_setup.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + tx_misra.c + 1 + ..\..\..\..\common\src\tx_misra.c + + + tx_mutex_cleanup.c + 1 + ..\..\..\..\common\src\tx_mutex_cleanup.c + + + tx_mutex_create.c + 1 + ..\..\..\..\common\src\tx_mutex_create.c + + + tx_mutex_delete.c + 1 + ..\..\..\..\common\src\tx_mutex_delete.c + + + tx_mutex_get.c + 1 + ..\..\..\..\common\src\tx_mutex_get.c + + + tx_mutex_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_info_get.c + + + tx_mutex_initialize.c + 1 + ..\..\..\..\common\src\tx_mutex_initialize.c + + + tx_mutex_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + tx_mutex_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + tx_mutex_prioritize.c + 1 + ..\..\..\..\common\src\tx_mutex_prioritize.c + + + tx_mutex_priority_change.c + 1 + ..\..\..\..\common\src\tx_mutex_priority_change.c + + + tx_mutex_put.c + 1 + ..\..\..\..\common\src\tx_mutex_put.c + + + tx_queue_cleanup.c + 1 + ..\..\..\..\common\src\tx_queue_cleanup.c + + + tx_queue_create.c + 1 + ..\..\..\..\common\src\tx_queue_create.c + + + tx_queue_delete.c + 1 + ..\..\..\..\common\src\tx_queue_delete.c + + + tx_queue_flush.c + 1 + ..\..\..\..\common\src\tx_queue_flush.c + + + tx_queue_front_send.c + 1 + ..\..\..\..\common\src\tx_queue_front_send.c + + + tx_queue_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_info_get.c + + + tx_queue_initialize.c + 1 + ..\..\..\..\common\src\tx_queue_initialize.c + + + tx_queue_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + + + tx_queue_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + tx_queue_prioritize.c + 1 + ..\..\..\..\common\src\tx_queue_prioritize.c + + + tx_queue_receive.c + 1 + ..\..\..\..\common\src\tx_queue_receive.c + + + tx_queue_send.c + 1 + ..\..\..\..\common\src\tx_queue_send.c + + + tx_queue_send_notify.c + 1 + ..\..\..\..\common\src\tx_queue_send_notify.c + + + tx_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + tx_semaphore_cleanup.c + 1 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + + + tx_semaphore_create.c + 1 + ..\..\..\..\common\src\tx_semaphore_create.c + + + tx_semaphore_delete.c + 1 + ..\..\..\..\common\src\tx_semaphore_delete.c + + + tx_semaphore_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_get.c + + + tx_semaphore_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_info_get.c + + + tx_semaphore_initialize.c + 1 + ..\..\..\..\common\src\tx_semaphore_initialize.c + + + tx_semaphore_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + tx_semaphore_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + tx_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + + + tx_semaphore_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_put.c + + + tx_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + + + tx_thread_create.c + 1 + ..\..\..\..\common\src\tx_thread_create.c + + + tx_thread_delete.c + 1 + ..\..\..\..\common\src\tx_thread_delete.c + + + tx_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + tx_thread_identify.c + 1 + ..\..\..\..\common\src\tx_thread_identify.c + + + tx_thread_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_info_get.c + + + tx_thread_initialize.c + 1 + ..\..\..\..\common\src\tx_thread_initialize.c + + + tx_thread_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + + + tx_thread_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + tx_thread_preemption_change.c + 1 + ..\..\..\..\common\src\tx_thread_preemption_change.c + + + tx_thread_priority_change.c + 1 + ..\..\..\..\common\src\tx_thread_priority_change.c + + + tx_thread_relinquish.c + 1 + ..\..\..\..\common\src\tx_thread_relinquish.c + + + tx_thread_reset.c + 1 + ..\..\..\..\common\src\tx_thread_reset.c + + + tx_thread_resume.c + 1 + ..\..\..\..\common\src\tx_thread_resume.c + + + tx_thread_shell_entry.c + 1 + ..\..\..\..\common\src\tx_thread_shell_entry.c + + + tx_thread_sleep.c + 1 + ..\..\..\..\common\src\tx_thread_sleep.c + + + tx_thread_stack_analyze.c + 1 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + + + tx_thread_stack_error_handler.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + tx_thread_stack_error_notify.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + tx_thread_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_suspend.c + + + tx_thread_system_preempt_check.c + 1 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + tx_thread_system_resume.c + 1 + ..\..\..\..\common\src\tx_thread_system_resume.c + + + tx_thread_system_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_system_suspend.c + + + tx_thread_terminate.c + 1 + ..\..\..\..\common\src\tx_thread_terminate.c + + + tx_thread_time_slice.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice.c + + + tx_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + + + tx_thread_timeout.c + 1 + ..\..\..\..\common\src\tx_thread_timeout.c + + + tx_thread_wait_abort.c + 1 + ..\..\..\..\common\src\tx_thread_wait_abort.c + + + tx_time_get.c + 1 + ..\..\..\..\common\src\tx_time_get.c + + + tx_time_set.c + 1 + ..\..\..\..\common\src\tx_time_set.c + + + tx_timer_activate.c + 1 + ..\..\..\..\common\src\tx_timer_activate.c + + + tx_timer_change.c + 1 + ..\..\..\..\common\src\tx_timer_change.c + + + tx_timer_create.c + 1 + ..\..\..\..\common\src\tx_timer_create.c + + + tx_timer_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_deactivate.c + + + tx_timer_delete.c + 1 + ..\..\..\..\common\src\tx_timer_delete.c + + + tx_timer_expiration_process.c + 1 + ..\..\..\..\common\src\tx_timer_expiration_process.c + + + tx_timer_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_info_get.c + + + tx_timer_initialize.c + 1 + ..\..\..\..\common\src\tx_timer_initialize.c + + + tx_timer_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + + + tx_timer_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + tx_timer_system_activate.c + 1 + ..\..\..\..\common\src\tx_timer_system_activate.c + + + tx_timer_system_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + + + tx_timer_thread_entry.c + 1 + ..\..\..\..\common\src\tx_timer_thread_entry.c + + + tx_trace_buffer_full_notify.c + 1 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + tx_trace_disable.c + 1 + ..\..\..\..\common\src\tx_trace_disable.c + + + tx_trace_enable.c + 1 + ..\..\..\..\common\src\tx_trace_enable.c + + + tx_trace_event_filter.c + 1 + ..\..\..\..\common\src\tx_trace_event_filter.c + + + tx_trace_event_unfilter.c + 1 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + + + tx_trace_initialize.c + 1 + ..\..\..\..\common\src\tx_trace_initialize.c + + + tx_trace_interrupt_control.c + 1 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + + + tx_trace_isr_enter_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + tx_trace_isr_exit_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + tx_trace_object_register.c + 1 + ..\..\..\..\common\src\tx_trace_object_register.c + + + tx_trace_object_unregister.c + 1 + ..\..\..\..\common\src\tx_trace_object_unregister.c + + + tx_trace_user_event_insert.c + 1 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + + + txe_block_allocate.c + 1 + ..\..\..\..\common\src\txe_block_allocate.c + + + txe_block_pool_create.c + 1 + ..\..\..\..\common\src\txe_block_pool_create.c + + + txe_block_pool_delete.c + 1 + ..\..\..\..\common\src\txe_block_pool_delete.c + + + txe_block_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_block_pool_info_get.c + + + txe_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + + + txe_block_release.c + 1 + ..\..\..\..\common\src\txe_block_release.c + + + txe_byte_allocate.c + 1 + ..\..\..\..\common\src\txe_byte_allocate.c + + + txe_byte_pool_create.c + 1 + ..\..\..\..\common\src\txe_byte_pool_create.c + + + txe_byte_pool_delete.c + 1 + ..\..\..\..\common\src\txe_byte_pool_delete.c + + + txe_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + + + txe_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + txe_byte_release.c + 1 + ..\..\..\..\common\src\txe_byte_release.c + + + txe_event_flags_create.c + 1 + ..\..\..\..\common\src\txe_event_flags_create.c + + + txe_event_flags_delete.c + 1 + ..\..\..\..\common\src\txe_event_flags_delete.c + + + txe_event_flags_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_get.c + + + txe_event_flags_info_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_info_get.c + + + txe_event_flags_set.c + 1 + ..\..\..\..\common\src\txe_event_flags_set.c + + + txe_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + + + txe_mutex_create.c + 1 + ..\..\..\..\common\src\txe_mutex_create.c + + + txe_mutex_delete.c + 1 + ..\..\..\..\common\src\txe_mutex_delete.c + + + txe_mutex_get.c + 1 + ..\..\..\..\common\src\txe_mutex_get.c + + + txe_mutex_info_get.c + 1 + ..\..\..\..\common\src\txe_mutex_info_get.c + + + txe_mutex_prioritize.c + 1 + ..\..\..\..\common\src\txe_mutex_prioritize.c + + + txe_mutex_put.c + 1 + ..\..\..\..\common\src\txe_mutex_put.c + + + txe_queue_create.c + 1 + ..\..\..\..\common\src\txe_queue_create.c + + + txe_queue_delete.c + 1 + ..\..\..\..\common\src\txe_queue_delete.c + + + txe_queue_flush.c + 1 + ..\..\..\..\common\src\txe_queue_flush.c + + + txe_queue_front_send.c + 1 + ..\..\..\..\common\src\txe_queue_front_send.c + + + txe_queue_info_get.c + 1 + ..\..\..\..\common\src\txe_queue_info_get.c + + + txe_queue_prioritize.c + 1 + ..\..\..\..\common\src\txe_queue_prioritize.c + + + txe_queue_receive.c + 1 + ..\..\..\..\common\src\txe_queue_receive.c + + + txe_queue_send.c + 1 + ..\..\..\..\common\src\txe_queue_send.c + + + txe_queue_send_notify.c + 1 + ..\..\..\..\common\src\txe_queue_send_notify.c + + + txe_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + txe_semaphore_create.c + 1 + ..\..\..\..\common\src\txe_semaphore_create.c + + + txe_semaphore_delete.c + 1 + ..\..\..\..\common\src\txe_semaphore_delete.c + + + txe_semaphore_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_get.c + + + txe_semaphore_info_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_info_get.c + + + txe_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + + + txe_semaphore_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_put.c + + + txe_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + + + txe_thread_create.c + 1 + ..\..\..\..\common\src\txe_thread_create.c + + + txe_thread_delete.c + 1 + ..\..\..\..\common\src\txe_thread_delete.c + + + txe_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + txe_thread_info_get.c + 1 + ..\..\..\..\common\src\txe_thread_info_get.c + + + txe_thread_preemption_change.c + 1 + ..\..\..\..\common\src\txe_thread_preemption_change.c + + + txe_thread_priority_change.c + 1 + ..\..\..\..\common\src\txe_thread_priority_change.c + + + txe_thread_relinquish.c + 1 + ..\..\..\..\common\src\txe_thread_relinquish.c + + + txe_thread_reset.c + 1 + ..\..\..\..\common\src\txe_thread_reset.c + + + txe_thread_resume.c + 1 + ..\..\..\..\common\src\txe_thread_resume.c + + + txe_thread_suspend.c + 1 + ..\..\..\..\common\src\txe_thread_suspend.c + + + txe_thread_terminate.c + 1 + ..\..\..\..\common\src\txe_thread_terminate.c + + + txe_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + + + txe_thread_wait_abort.c + 1 + ..\..\..\..\common\src\txe_thread_wait_abort.c + + + txe_timer_activate.c + 1 + ..\..\..\..\common\src\txe_timer_activate.c + + + txe_timer_change.c + 1 + ..\..\..\..\common\src\txe_timer_change.c + + + txe_timer_create.c + 1 + ..\..\..\..\common\src\txe_timer_create.c + + + txe_timer_deactivate.c + 1 + ..\..\..\..\common\src\txe_timer_deactivate.c + + + txe_timer_delete.c + 1 + ..\..\..\..\common\src\txe_timer_delete.c + + + txe_timer_info_get.c + 1 + ..\..\..\..\common\src\txe_timer_info_get.c + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m3/keil/example_build/sample_threadx.c b/ports/cortex_m3/keil/example_build/sample_threadx.c new file mode 100644 index 00000000..9b94bcd4 --- /dev/null +++ b/ports/cortex_m3/keil/example_build/sample_threadx.c @@ -0,0 +1,262 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of six + threads of different priorities, using a message queue, semaphore, and an event flags group. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_QUEUE_SIZE 10 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_EVENT_FLAGS_GROUP event_flags_0; + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; + + +/* Define the thread stacks. */ + +UCHAR thread_0_stack[DEMO_STACK_SIZE]; +UCHAR thread_1_stack[DEMO_STACK_SIZE]; +UCHAR thread_2_stack[DEMO_STACK_SIZE]; +UCHAR thread_3_stack[DEMO_STACK_SIZE]; +UCHAR thread_4_stack[DEMO_STACK_SIZE]; +UCHAR thread_5_stack[DEMO_STACK_SIZE]; + + +/* Define the queue area. */ + +UCHAR queue_0_area[DEMO_QUEUE_SIZE*sizeof(ULONG)]; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); + + +volatile unsigned int bootloop; + +/* Define main entry point. */ + + + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + + + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + thread_0_stack, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + thread_1_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + thread_2_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + thread_3_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + thread_4_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + thread_5_stack, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, queue_0_area, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} diff --git a/ports/cortex_m3/keil/example_build/tx_initialize_low_level.s b/ports/cortex_m3/keil/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..4b55621a --- /dev/null +++ b/ports/cortex_m3/keil/example_build/tx_initialize_low_level.s @@ -0,0 +1,266 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + LDR R0, =__main + BX R0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M3/RVDS */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick for 100Hz clock, or 16384 cycles if no reference. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + STACK_SIZE) + LDR R2, =(HeapMem + HEAP_SIZE) + LDR R3, =StackMem + BX LR +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + + diff --git a/ports/cortex_m3/keil/inc/tx_port.h b/ports/cortex_m3/keil/inc/tx_port.h new file mode 100644 index 00000000..6b0adb0d --- /dev/null +++ b/ports/cortex_m3/keil/inc/tx_port.h @@ -0,0 +1,346 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M3/Keil */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M3/Keil Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m3/keil/readme_threadx.txt b/ports/cortex_m3/keil/readme_threadx.txt new file mode 100644 index 00000000..e0c99485 --- /dev/null +++ b/ports/cortex_m3/keil/readme_threadx.txt @@ -0,0 +1,152 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M3 + + Thumb & 32-bit Mode + + Using the Keil Microcontroller Development Kit + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy, simply load the project file +ThreadX_Library.Uv2, which is located inside the "example_build" directory. + +Once the ThreadX library files are displayed in the project window, +select the "Build Target" operation and observe the compilation and assembly +of the ThreadX library. This project build produces the ThreadX library +file ThreadX_Library.lib. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the Keil simulator or +Cortex-M3 hardware. This demonstration is slightly smaller than typical ThreadX +demonstrations, and thus requires less than 7KB of Flash and less than 4KB of RAM. + +Building the demonstration is easy; simply open the ThreadX demonstration +project file ThreadX_Demo.Uv2, which is located inside the "example_build" +directory. + +Once open, select the "Build Target" operation and observe the compilation of +sample_threadx.c (which is the demonstration application) and linking with +ThreadX_Library.lib. The resulting file ThreadX_Demo.axf is a binary file that +can be downloaded and executed under the uVision simulator or Cortex-M3 hardware. + +For simulator execution, the following memory regions need to be defined via +the "Debug -> Memory Map" dialog: + +0x20000000, 0x20080000 [check read and write access] +0xE0000000, 0xE8000000 [check read and write access] + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M3 using Keil tools is at label +__main. This is defined within the Keil compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M3 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M3 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M3 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M3 using Keil tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m3/keil/src/tx_thread_context_restore.s b/ports/cortex_m3/keil/src/tx_thread_context_restore.s new file mode 100644 index 00000000..d78da55e --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_context_restore.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/keil/src/tx_thread_context_save.s b/ports/cortex_m3/keil/src/tx_thread_context_save.s new file mode 100644 index 00000000..5645d361 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_context_save.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m3/keil/src/tx_thread_interrupt_control.s b/ports/cortex_m3/keil/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..de8f1029 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_interrupt_control.s @@ -0,0 +1,85 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s b/ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..2ff46cad --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s b/ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..43c20a0f --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m3/keil/src/tx_thread_schedule.s b/ports/cortex_m3/keil/src/tx_thread_schedule.s new file mode 100644 index 00000000..3b9f2cda --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_schedule.s @@ -0,0 +1,253 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + ALIGN + LTORG + END + diff --git a/ports/cortex_m3/keil/src/tx_thread_stack_build.s b/ports/cortex_m3/keil/src/tx_thread_stack_build.s new file mode 100644 index 00000000..bfc38038 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_stack_build.s @@ -0,0 +1,143 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M3 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/keil/src/tx_thread_system_return.s b/ports/cortex_m3/keil/src/tx_thread_system_return.s new file mode 100644 index 00000000..59d59bc6 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_thread_system_return.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m3/keil/src/tx_timer_interrupt.s b/ports/cortex_m3/keil/src/tx_timer_interrupt.s new file mode 100644 index 00000000..e8c34551 --- /dev/null +++ b/ports/cortex_m3/keil/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M3/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/ac5/example_build/build_threadx.bat b/ports/cortex_m4/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..8971b7fa --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m4 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m4 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-m4 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m4/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m4/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..cf7a2d50 --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m4 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m4 -O2 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m4/ac5/example_build/sample_threadx.c b/ports/cortex_m4/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..dc0fdd8b --- /dev/null +++ b/ports/cortex_m4/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,267 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, =0xE000ED88 ; Pickup address of CPACR + LDR r1, [r0] ; Pickup CPACR + MOV32 r2, 0x00F00000 ; Build enable value + ORR r1, r1, r2 ; Or in enable value + STR r1, [r0] ; Setup CPACR + ENDIF + LDR r0, =__main + BX r0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation. */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =HeapMem + LDR r1, =(StackMem + STACK_SIZE) + LDR r2, =(HeapMem + HEAP_SIZE) + LDR r3, =StackMem + BX lr +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/ac5/inc/tx_port.h b/ports/cortex_m4/ac5/inc/tx_port.h new file mode 100644 index 00000000..76bccfa6 --- /dev/null +++ b/ports/cortex_m4/ac5/inc/tx_port.h @@ -0,0 +1,471 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M4/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +#ifdef __TARGET_FPU_VFP + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#else + +#ifdef TX_SOURCE_CODE + +register ULONG _control __asm("control"); + +#endif +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +void _tx_vfp_access(void); + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_vfp_access(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + +/* Define FPU extension for the Cortex-M4. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M4/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m4/ac5/readme_threadx.txt b/ports/cortex_m4/ac5/readme_threadx.txt new file mode 100644 index 00000000..cfd9ae0b --- /dev/null +++ b/ports/cortex_m4/ac5/readme_threadx.txt @@ -0,0 +1,207 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Using ARM Compiler 5 (AC5) + + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +development environment. At this point you may run the build_threadx.bat batch +file. This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 s0 + 0x04 s1 + 0x08 s2 + 0x0C s3 + 0x10 s4 + 0x14 s5 + 0x18 s6 + 0x1C s7 + 0x20 s8 + 0x24 s9 + 0x28 s10 + 0x2C s11 + 0x30 s12 + 0x34 s13 + 0x38 s14 + 0x3C s15 + 0x40 s16 + 0x44 s17 + 0x48 s18 + 0x4C s19 + 0x50 s20 + 0x54 s21 + 0x58 s22 + 0x5C s23 + 0x60 s24 + 0x64 s25 + 0x68 s26 + 0x6C s27 + 0x70 s28 + 0x74 s29 + 0x78 s30 + 0x7C s31 + 0x80 fpscr + 0x84 r4 + 0x88 r5 + 0x8C r6 + 0x90 r7 + 0x94 r8 + 0x98 r9 + 0x9C r10 (sl) + 0xA0 r11 + 0xA4 r0 (Hardware stack starts here!!) + 0xA8 r1 + 0xAC r2 + 0xB0 r3 + 0xB4 r12 + 0xB8 lr + 0xBC pc + 0xC0 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M4 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. FPU Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M4 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/ac5/src/tx_thread_context_restore.s b/ports/cortex_m4/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..6d310a17 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_context_save.s b/ports/cortex_m4/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..052c3e5a --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_context_save.s @@ -0,0 +1,94 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr0, r} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..e97c7a47 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,80 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..e366e44b --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,78 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation. */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..1d0bffb6 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,77 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation. */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m4/ac5/src/tx_thread_schedule.s b/ports/cortex_m4/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..e78a040d --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_schedule.s @@ -0,0 +1,293 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; + IF {TARGET_FPU_VFP} = {TRUE} + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register + ENDIF +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save + ENDIF + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore + ENDIF + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_fpu_enable +tx_thread_fpu_enable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT tx_thread_fpu_disable +tx_thread_fpu_disable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT _tx_vfp_access +_tx_vfp_access + VMOV.F32 s0, s0 ; Simply access the VFP + BX lr ; Return to caller + + + ENDIF + + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/ac5/src/tx_thread_stack_build.s b/ports/cortex_m4/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..d9cf2a1f --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,138 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M4 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/ac5/src/tx_thread_system_return.s b/ports/cortex_m4/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..c61d0e53 --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_thread_system_return.s @@ -0,0 +1,91 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/ac5/src/tx_timer_interrupt.s b/ports/cortex_m4/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..af94c70c --- /dev/null +++ b/ports/cortex_m4/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,266 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/gnu/CMakeLists.txt b/ports/cortex_m4/gnu/CMakeLists.txt index cb3091b9..71e2d4f2 100644 --- a/ports/cortex_m4/gnu/CMakeLists.txt +++ b/ports/cortex_m4/gnu/CMakeLists.txt @@ -9,7 +9,6 @@ target_sources(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_stack_build.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.S - # {{END_TARGET_SOURCES}} ) diff --git a/ports/cortex_m4/gnu/example_build/build_threadx.bat b/ports/cortex_m4/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..062092d3 --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m4/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m4/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..fd75f7bd --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb tx_simulator_startup.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb cortexm4_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m4 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m4 -ereset_handler -T sample_threadx.ld tx_simulator_startup.o cortexm4_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m4/gnu/example_build/cortexm4_crt0.s b/ports/cortex_m4/gnu/example_build/cortexm4_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/cortexm4_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m4/gnu/example_build/libc.a b/ports/cortex_m4/gnu/example_build/libc.a new file mode 100644 index 00000000..6c1567d1 Binary files /dev/null and b/ports/cortex_m4/gnu/example_build/libc.a differ diff --git a/ports/cortex_m4/gnu/example_build/sample_threadx.c b/ports/cortex_m4/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..597f373c --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m4/gnu/example_build/sample_threadx.ld b/ports/cortex_m4/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m4/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m4/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S similarity index 95% rename from ports/cortex_m4/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S index ce57f6e7..00db7ac2 100644 --- a/ports/cortex_m4/gnu/src/tx_initialize_low_level_sample.S +++ b/ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S @@ -59,7 +59,7 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M4/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -93,6 +93,9 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), fixed */ +@/* GNU assembly comment, */ +@/* resulting in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_initialize_low_level(VOID) @@ -191,14 +194,14 @@ __tx_IntHandler: @ { PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif @ /* Do interrupt handler work here */ @ /* BL .... */ #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR @@ -216,11 +219,11 @@ SysTick_Handler: @ PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif BL _tx_timer_interrupt #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR diff --git a/ports/cortex_m4/gnu/src/tx_vector_table_sample.S b/ports/cortex_m4/gnu/example_build/tx_simulator_startup.s similarity index 100% rename from ports/cortex_m4/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m4/gnu/example_build/tx_simulator_startup.s diff --git a/ports/cortex_m4/gnu/readme_threadx.txt b/ports/cortex_m4/gnu/readme_threadx.txt new file mode 100644 index 00000000..a8c7c684 --- /dev/null +++ b/ports/cortex_m4/gnu/readme_threadx.txt @@ -0,0 +1,218 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M4 + +The ThreadX demonstration is designed to execute on Cortex-M4 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using gnu tools uses the standard GNU +Cortex-M4 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 s0 + 0x08 s1 + 0x0C s2 + 0x10 s3 + 0x14 s4 + 0x18 s5 + 0x1C s6 + 0x20 s7 + 0x24 s8 + 0x28 s9 + 0x2C s10 + 0x30 s11 + 0x34 s12 + 0x38 s13 + 0x3C s14 + 0x40 s15 + 0x44 s16 + 0x48 s17 + 0x4C s18 + 0x50 s19 + 0x54 s20 + 0x58 s21 + 0x5C s22 + 0x60 s23 + 0x64 s24 + 0x68 s25 + 0x6C s26 + 0x70 s27 + 0x74 s28 + 0x78 s29 + 0x7C s30 + 0x80 s31 + 0x84 fpscr + 0x88 r4 + 0x8C r5 + 0x90 r6 + 0x94 r7 + 0x98 r8 + 0x9C r9 + 0xA0 r10 (sl) + 0xA4 r11 + 0xA8 r0 (Hardware stack starts here!!) + 0xAC r1 + 0xB0 r2 + 0xB4 r3 + 0xB8 r12 + 0xBC lr + 0xC0 pc + 0xC4 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M4 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +ISRs can be written completely in C (or assembly language) without any calls to +_tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed access to the +ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + + .global your_assembly_isr + .thumb_func +your_assembly_isr: +; VOID your_assembly_isr(VOID) +; { + PUSH {r0, lr} +; +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, lr} + BX lr +; } + +Note: the Cortex-M4 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. FPU Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context. If saving the context of the FPU registers is needed, the ThreadX library should be re-built +with TX_ENABLE_FPU_SUPPORT defined. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M4 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/gnu/src/tx_thread_stack_build.S b/ports/cortex_m4/gnu/src/tx_thread_stack_build.S index f9ca6842..9307686e 100644 --- a/ports/cortex_m4/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m4/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M4/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -91,7 +96,7 @@ _tx_thread_stack_build: @ r7 Initial value for r7 @ r8 Initial value for r8 @ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) +@ r10 Initial value for r10 @ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @@ -119,9 +124,7 @@ _tx_thread_stack_build: STR r3, [r2, #16] @ Store initial r7 STR r3, [r2, #20] @ Store initial r8 STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOV r3, #0 @ Build initial register value + STR r3, [r2, #28] @ Store initial r10 STR r3, [r2, #32] @ Store initial r11 @ @ /* Hardware stack follows. */ diff --git a/ports/cortex_m4/iar/example_build/azure_rtos.eww b/ports/cortex_m4/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m4/iar/example_build/cstartup_M.s b/ports/cortex_m4/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..75d9369b --- /dev/null +++ b/ports/cortex_m4/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(1) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + B __iar_program_start + + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.c b/ports/cortex_m4/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..60f5a3d3 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.c @@ -0,0 +1,389 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + +/* Define event buffer. */ + +#ifdef TX_ENABLE_EVENT_TRACE +UCHAR trace_buffer[0x10000]; +#endif + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + +#ifdef TX_ENABLE_EVENT_TRACE + tx_trace_enable(trace_buffer, sizeof(trace_buffer), 32); +#endif + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.dep b/ports/cortex_m4/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..d9c41b76 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.dep @@ -0,0 +1,112 @@ + + + 4 + 1715762055 + + Debug + + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\lib\dl7M_tln.a + $TOOLKIT_DIR$\lib\m7M_tl.a + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + [ROOT_NODE] + + + ILINK + 23 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 25 + + + __cstat + 26 + + + BICOMP + 19 + + + + + ICCARM + 27 29 20 17 6 9 18 5 13 12 16 24 14 30 28 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 21 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 4 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 10 21 25 2 4 15 11 8 7 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.ewd b/ports/cortex_m4/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..22c813a3 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.ewp b/ports/cortex_m4/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..4d3848a5 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2137 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.ewt b/ports/cortex_m4/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..24445b46 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m4/iar/example_build/sample_threadx.icf b/ports/cortex_m4/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..246d387e --- /dev/null +++ b/ports/cortex_m4/iar/example_build/sample_threadx.icf @@ -0,0 +1,42 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define symbol FlashConfig_start__= 0x00000400; +define symbol FlashConfig_end__ = 0x0000040f; + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to (FlashConfig_start__ - 1)] | [from (FlashConfig_end__+1) to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +define region FlashConfig_region = mem:[from FlashConfig_start__ to FlashConfig_end__]; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; + +place in FlashConfig_region + {section FlashConfig}; + +place in RAM_region { last section FREE_MEM}; + diff --git a/ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..e7b3c139 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 265 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0100000030002596000002000000138600000800000029810000020000005786000001000000108600003600000001840000010000005992000001000000268100000100000000DA00000100000029E1000002000000ED8000000100000020810000010000000F810000010000000C8100000E0000000D8000000100000001E10000010000001D81000002000000EA8000000100000008DA000001000000048600000200000003DC0000010000002496000001000000178100000400000056860000010000000384000005000000148100000100000007B000000100000000810000020000000C8600000100000003E10000020000001A86000001000000EC800000010000000E81000001000000E9800000020000000B810000020000001486000002000000118600003500000002840000010000000086000001000000F48000000100000055860000010000002481000001000000468100000200000008860000010000000D81000002000000EB80000002000000E88000000300000006DA000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000033040000000A000065050000 + 000000001C040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000034040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000005101000018040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF510100003200000055010000180400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000018040000000A00001C040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000033040000000A000065050000000000001C040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..82a22cfe --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..e2a56b8d --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..22bc90ef --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M4" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..bb613a13 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m4\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m4/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..d85ff638 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1701 @@ + + + + + + 20 + 1350 + + + 20 + 1012 + 270 + 67 + + + + 124 + 27 + 27 + 27 + + + + 1 + 1 + 1 + + + + + + + 171 + 100 + 100 + 100 + + + + + + + TabID-19457-10101 + Debug Log + Debug-Log + + + + TabID-18934-10111 + Build + Build + + + + 0 + + + + + TabID-30205-10105 + Workspace + Workspace + + + sample_threadx + + + + + 0 + + + + + TabID-8186-10108 + Disassembly + Disassembly + + + + 0 + + + + + TabID-23179-10441 + Thread List + TX-THREAD + + + TabID-22657-10451 + Message Queues + TX-MESSAGEQUEUE + + + TabID-22134-10461 + Semaphores + TX-SEMAPHORE + + + TabID-32359-10474 + Mutexes + TX-MUTEX + + + TabID-9817-10487 + Byte Pools + TX-BYTEPOOL + + + TabID-9294-10497 + Block Pools + TX-BLOCKPOOL + + + TabID-19520-10510 + Timers + TX-TIMER + + + TabID-29745-10523 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + TabID-17429-10549 + Watch + Watch + + + + thread_0_counter + + + thread_1_counter + + + thread_2_counter + + + thread_3_counter + + + thread_4_counter + + + thread_5_counter + + + thread_6_counter + + + thread_7_counter + + + 0 + 171 + 100 + 100 + 100 + + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 216 + 7445 + 7445 + + + TextEditor + $WS_DIR$\tx_queue_send.c + 0 + 155 + 10012 + 10012 + + 1 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 519 + 198 + -2 + -2 + 200 + 200 + 141945 + 195122 + 141945 + 508293 + + + + + + + + + + + -2 + -2 + 519 + 350 + -2 + -2 + 200 + 200 + 141945 + 195122 + 249823 + 508293 + + + + + + + + + -2 + 348 + 519 + 635 + 348 + -2 + 200 + 200 + 141945 + 195122 + 203691 + 508293 + + + + + + + + + + + -2 + -2 + 198 + 1411 + -2 + -2 + 1413 + 200 + 1002839 + 195122 + 141945 + 195122 + + + + + + + + + 196 + -2 + 413 + 1411 + -2 + 196 + 1413 + 217 + 1002839 + 211707 + 141945 + 195122 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 136 + 150 + 100 + 100 + + + + 1 + 1 + + Disassembly + _I0 + + + 500 + 20 + + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 4D00000030002596000002000000138600000800000029810000020000005786000001000000108600003600000001840000010000005992000001000000268100000100000000DA00000100000029E1000002000000ED8000000100000020810000010000000F810000010000000C8100000E0000000D8000000100000001E10000010000001D81000002000000EA8000000100000008DA000001000000048600000200000003DC0000010000002496000001000000178100000400000056860000010000000384000005000000148100000100000007B000000100000000810000020000000C8600000100000003E10000020000001A86000001000000EC800000010000000E81000004000000E9800000020000000B810000020000001486000002000000118600003500000002840000010000000086000001000000F48000000100000055860000010000002481000001000000468100000200000008860000010000000D81000002000000EB80000002000000E88000000300000006DA000001000000 + + + 15007784000007840000FFFFFFFF808C000044D500008386000058860000008D0000439200001E920000289200002992000024960000259600001F960000008800000188000002880000038800000488000005880000 + 390004840000790000005786000018000000599200002300000015810000520000003184000080000000239200000000000007E10000680000000F81000050000000208100005800000004E10000660000000C8100004D00000007860000270000001D920000110000000D8000004400000001E1000063000000068400007B000000048600002400000003840000780000009A860000160000001781000054000000008400007500000025920000190000001481000051000000308400007F0000000E8400007D000000449200002100000000810000460000000E8100004F0000001F810000570000001A860000310000001F9200001E00000003E10000650000000B8100004C0000008E8600003A00000006860000260000002D9200002000000000E1000062000000058400007A000000698600003700000041E100007200000002840000770000005586000006000000239600008600000016810000530000003284000081000000108400007E0000000E86000017000000518400008300000005E10000670000000D8100004E0000000A8400007C000000A18600003B000000C38600000300000002E1000064000000C08600000A00000005860000250000002C9200001F000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000CA020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34062 + 46080000610000006809000011010000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34064 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34100 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34112 + 46080000610000006809000011010000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 4608000061000000C60A0000F1000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34060 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 46080000610000004C090000C1010000 + 9E05000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34067 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 46080000610000006809000021010000 + 040000000B020000A006000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 46080000610000004C090000C1010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 46080000610000004C090000C1010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34104 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 4608000061000000F409000021010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 4608000061000000F409000021010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 46080000610000006809000011010000 + 0A01000003020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34115 + 46080000610000006809000011010000 + 0A01000003020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + 46080000610000006809000011010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 46080000610000004C090000C1010000 + FA0800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34118 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 46080000610000004C090000C1010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000001000000FFFFFFFFFFFFFFFFF60800004C000000FA0800009A040000010000000200001004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A406000003020000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF0A010000FF010000A406000003020000000000000100000004000000010000000000000000000000428500000000000000000000000000000000000001000000428500000100000042850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF0100000049850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CA020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004985000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4985000001000000FFFFFFFF49850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EF010000A4060000F3010000000000000100000004000000010000000000000000000000FFFFFFFF040000001A8500001B8500001C8500001D85000001800080000000000000000000000A020000A4060000CA02000000000000F3010000A4060000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001A85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001D85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1A85000001000000FFFFFFFF1A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF9A050000320000009E050000B30200000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000E85000010850000118500001285000034850000408500000180008000000100000000000000CE020000A40600007E030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003485000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004085000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004B85000000000000000000000000000000000000010000004B850000010000004B850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E148600000000000030000000FFFEFF205200650073006500740020007400680065002000640065006200750067006700650064002000700072006F006700720061006D000A00520065007300650074000000000000000000000000000100000001000000000000000000000001000000020009800000000000000400FFFFFFFFFFFEFF000000000000000000000000000100000001000000000000000000000001000000000009801986000000000000FFFFFFFFFFFEFF000100000000000000000000000100000001000000000000000000000001000000000000000000FFFEFF0544006500620075006700C6000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000F103000034000000 + 8192 + 1 + 0 + 198 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000062000000FFFEFF000000000000000000000000000100000001000000018001E100000000000063000000FFFEFF000000000000000000000000000100000001000000018003E100000000040065000000FFFEFF0000000000000000000000000001000000010000000180008100000000000046000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000040068000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018022E100000000040069000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE10000000004006F000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF00960000000000000000000180218100000000040059000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018029E10000000004006E000000FFFEFF0000000000000000000000000001000000010000000180028100000000040048000000FFFEFF000000000000000000000000000100000001000000018029810000000004005D000000FFFEFF000000000000000000000000000100000001000000018027810000000004005B000000FFFEFF000000000000000000000000000100000001000000018028810000000004005C000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040055000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040056000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004C000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004D000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000061000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000057000000FFFEFF0000000000000000000000000001000000010000000180208100000000000058000000FFFEFF000000000000000000000000000100000001000000018046810000000000005F000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34123 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34126 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34122 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..cf1f427a --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,100 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 4132951230 + + + 1 + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..22bc90ef --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M4" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.crun b/ports/cortex_m4/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.dbgdt b/ports/cortex_m4/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m4/iar/example_build/settings/tx.dnx b/ports/cortex_m4/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_m4/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m4/iar/example_build/tx.dep b/ports/cortex_m4/iar/example_build/tx.dep new file mode 100644 index 00000000..53d58a7c --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.dep @@ -0,0 +1,8968 @@ + + + 4 + 2672330084 + + Debug + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_misra.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 831 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 841 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 188 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 544 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 688 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 715 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 296 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 733 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 308 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 760 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 763 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 612 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 839 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 302 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 496 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 680 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 164 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 489 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 676 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 641 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 752 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 786 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 772 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 293 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 673 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 707 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 751 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 557 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 613 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 807 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 265 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 + + + + + [ROOT_NODE] + + + IARCHIVE + 498 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 540 + + + __cstat + 472 + + + BICOMP + 175 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 139 + + + BICOMP + 583 663 836 670 816 139 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 727 + + + __cstat + 475 + + + BICOMP + 737 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 139 + + + BICOMP + 678 714 753 139 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 187 + + + __cstat + 456 + + + BICOMP + 832 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 670 139 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 817 + + + __cstat + 470 + + + BICOMP + 840 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 670 139 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 263 + + + __cstat + 474 + + + BICOMP + 499 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 670 139 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 286 + + + __cstat + 460 + + + BICOMP + 726 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 139 + + + BICOMP + 678 714 753 139 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 730 + + + __cstat + 550 + + + BICOMP + 762 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 139 + + + BICOMP + 678 714 753 139 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 687 + + + __cstat + 467 + + + BICOMP + 592 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 268 + + + BICOMP + 663 681 583 693 670 816 268 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 532 + + + __cstat + 577 + + + BICOMP + 719 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 268 + + + BICOMP + 663 681 583 693 670 816 268 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 279 + + + __cstat + 465 + + + BICOMP + 288 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 139 + + + BICOMP + 583 663 836 670 816 139 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 299 + + + __cstat + 469 + + + BICOMP + 595 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 139 + + + BICOMP + 801 681 693 678 818 714 753 816 139 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 808 + + + __cstat + 561 + + + BICOMP + 582 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 139 + + + BICOMP + 801 681 693 678 818 714 753 816 139 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 584 + + + __cstat + 215 + + + BICOMP + 622 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 663 654 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 440 + + + __cstat + 466 + + + BICOMP + 285 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 268 + + + BICOMP + 640 818 836 753 816 268 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 580 + + + __cstat + 198 + + + BICOMP + 692 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 663 654 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 300 + + + __cstat + 732 + + + BICOMP + 305 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 663 654 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 686 + + + __cstat + 618 + + + BICOMP + 819 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 276 + + + __cstat + 638 + + + BICOMP + 295 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 663 509 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 709 + + + __cstat + 672 + + + BICOMP + 792 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 663 509 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 586 + + + __cstat + 773 + + + BICOMP + 834 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 756 693 306 545 759 509 654 139 268 + + + BICOMP + 663 711 545 139 836 693 509 681 816 756 306 759 654 268 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 820 + + + __cstat + 213 + + + BICOMP + 513 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 509 + + + BICOMP + 753 693 640 818 816 509 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 150 + + + __cstat + 717 + + + BICOMP + 184 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 836 654 + + + BICOMP + 640 818 654 693 753 816 836 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 771 + + + __cstat + 206 + + + BICOMP + 799 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 + + + BICOMP + 801 756 678 818 714 753 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 479 + + + __cstat + 700 + + + BICOMP + 192 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 509 + + + BICOMP + 711 663 681 836 816 509 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 694 + + + __cstat + 746 + + + BICOMP + 271 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 753 268 640 818 816 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 677 + + + __cstat + 668 + + + BICOMP + 698 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 753 268 640 818 816 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 151 + + + __cstat + 749 + + + BICOMP + 697 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 268 + + + BICOMP + 268 670 836 663 583 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 791 + + + __cstat + 766 + + + BICOMP + 531 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 268 + + + BICOMP + 663 583 693 681 670 816 268 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 294 + + + __cstat + 620 + + + BICOMP + 501 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 509 + + + BICOMP + 640 818 509 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 581 + + + __cstat + 658 + + + BICOMP + 755 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 654 + + + BICOMP + 663 654 583 756 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 602 + + + __cstat + 517 + + + BICOMP + 512 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 670 306 756 663 583 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 275 + + + __cstat + 649 + + + BICOMP + 741 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 663 509 711 816 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 546 + + + __cstat + 186 + + + BICOMP + 824 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 509 + + + BICOMP + 681 711 663 836 816 509 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 137 + + + __cstat + 761 + + + BICOMP + 533 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 654 + + + BICOMP + 753 681 693 640 818 816 654 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 617 + + + __cstat + 482 + + + BICOMP + 722 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 654 + + + BICOMP + 711 663 836 816 654 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 685 + + + __cstat + 461 + + + BICOMP + 838 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 268 + + + BICOMP + 640 818 836 753 816 268 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 537 + + + __cstat + 651 + + + BICOMP + 810 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 509 + + + BICOMP + 640 818 509 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 740 + + + __cstat + 457 + + + BICOMP + 528 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 753 268 640 818 816 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 683 + + + __cstat + 661 + + + BICOMP + 503 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 509 + + + BICOMP + 681 711 663 836 816 509 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 743 + + + __cstat + 185 + + + BICOMP + 163 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 268 + + + BICOMP + 268 670 836 681 663 583 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 543 + + + __cstat + 468 + + + BICOMP + 802 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 268 + + + BICOMP + 268 670 836 663 583 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 813 + + + __cstat + 203 + + + BICOMP + 297 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 509 + + + BICOMP + 681 640 818 509 836 753 816 693 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 712 + + + __cstat + 214 + + + BICOMP + 534 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 180 + + + __cstat + 473 + + + BICOMP + 837 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 681 753 816 693 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 452 + + + __cstat + 659 + + + BICOMP + 281 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 795 + + + __cstat + 616 + + + BICOMP + 777 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 681 836 816 693 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 767 + + + __cstat + 230 + + + BICOMP + 738 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 545 + + + BICOMP + 583 681 663 836 670 816 545 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 168 + + + __cstat + 657 + + + BICOMP + 675 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 654 + + + BICOMP + 640 818 654 836 753 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 785 + + + __cstat + 596 + + + BICOMP + 805 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 670 545 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 161 + + + __cstat + 463 + + + BICOMP + 666 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 823 + + + __cstat + 619 + + + BICOMP + 160 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 654 + + + BICOMP + 681 753 693 640 818 816 654 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 713 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 280 + + + __cstat + 691 + + + BICOMP + 829 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 756 + + + BICOMP + 818 756 678 714 753 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 304 + + + __cstat + 774 + + + BICOMP + 728 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 145 + + + __cstat + 650 + + + BICOMP + 529 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 759 + + + BICOMP + 678 714 753 818 836 801 816 759 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 147 + + + __cstat + 231 + + + BICOMP + 521 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 190 + + + __cstat + 480 + + + BICOMP + 629 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 681 678 714 753 545 818 836 801 816 693 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 655 + + + __cstat + 201 + + + BICOMP + 144 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 801 759 678 818 714 753 816 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 525 + + + __cstat + 202 + + + BICOMP + 149 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 681 711 663 759 836 816 693 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 827 + + + __cstat + 623 + + + BICOMP + 530 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 545 + + + BICOMP + 583 681 663 836 670 816 545 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 614 + + + __cstat + 695 + + + BICOMP + 708 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 759 + + + BICOMP + 711 663 759 836 816 693 681 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 321 + + + __cstat + 679 + + + BICOMP + 822 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 759 + + + BICOMP + 678 714 753 818 836 801 816 759 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 284 + + + __cstat + 776 + + + BICOMP + 289 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 801 759 678 818 714 753 816 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 628 + + + __cstat + 830 + + + BICOMP + 510 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 191 + + + __cstat + 483 + + + BICOMP + 604 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 801 759 678 818 714 753 816 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 429 + + + __cstat + 674 + + + BICOMP + 798 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 759 + + + BICOMP + 678 714 753 681 818 836 801 816 759 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 780 + + + __cstat + 563 + + + BICOMP + 303 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 545 + + + BICOMP + 801 681 693 678 818 714 753 816 545 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 182 + + + __cstat + 459 + + + BICOMP + 682 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 516 + + + __cstat + 471 + + + BICOMP + 591 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 670 545 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 292 + + + __cstat + 590 + + + BICOMP + 731 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 670 545 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 821 + + + __cstat + 790 + + + BICOMP + 536 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 312 + + + __cstat + 611 + + + BICOMP + 605 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 545 + + + BICOMP + 678 714 753 545 818 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 703 + + + __cstat + 744 + + + BICOMP + 589 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 759 + + + BICOMP + 663 693 681 711 816 759 583 670 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 588 + + + __cstat + 729 + + + BICOMP + 542 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 545 + + + BICOMP + 583 681 663 836 670 816 545 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 601 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 274 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 159 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 547 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 478 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 690 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 788 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 632 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 775 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 825 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 270 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 153 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 609 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 745 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 484 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 757 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 814 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 502 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 718 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 505 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 170 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 706 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 627 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 172 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 634 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 154 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 526 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 155 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 523 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 158 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 497 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 927 926 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 508 + + + __cstat + 228 + + + BICOMP + 199 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 681 693 663 583 816 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 515 + + + __cstat + 225 + + + BICOMP + 169 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 693 + + + BICOMP + 753 693 836 681 640 818 816 306 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 797 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 140 + + + __cstat + 218 + + + BICOMP + 704 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 753 306 836 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 625 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 282 + + + __cstat + 229 + + + BICOMP + 793 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 804 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 173 + + + __cstat + 261 + + + BICOMP + 277 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 + + + BICOMP + 693 681 801 816 711 818 714 753 756 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 613 + + + __cstat + 254 + + + BICOMP + 439 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 753 711 836 818 816 693 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 430 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 557 + + + __cstat + 220 + + + BICOMP + 493 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 306 678 663 836 816 693 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 179 + + + __cstat + 454 + + + BICOMP + 298 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 681 583 836 670 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 615 + + + __cstat + 257 + + + BICOMP + 725 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 784 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + __cstat + 240 + + + BICOMP + 290 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 760 + + + __cstat + 258 + + + BICOMP + 828 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 663 693 681 678 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 188 + + + __cstat + 208 + + + BICOMP + 787 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 836 + + + BICOMP + 753 836 306 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 485 + + + __cstat + 194 + + + BICOMP + 626 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 681 663 583 816 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 772 + + + __cstat + 219 + + + BICOMP + 511 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 753 306 836 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 807 + + + __cstat + 251 + + + BICOMP + 504 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 624 + + + __cstat + 210 + + + BICOMP + 631 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 681 670 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 520 + + + __cstat + 237 + + + BICOMP + 789 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 291 + + + __cstat + 197 + + + BICOMP + 152 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 842 + + + __cstat + 255 + + + BICOMP + 710 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 587 + + + __cstat + 200 + + + BICOMP + 809 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 663 583 836 670 816 693 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 841 + + + __cstat + 238 + + + BICOMP + 438 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 693 + + + BICOMP + 753 693 681 836 640 818 816 306 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 724 + + + __cstat + 462 + + + BICOMP + 535 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 681 663 583 816 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 597 + + + __cstat + 243 + + + BICOMP + 739 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 681 663 583 836 670 816 693 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 539 + + + __cstat + 209 + + + BICOMP + 812 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 756 + + + BICOMP + 818 756 678 714 753 836 801 816 693 681 640 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 770 + + + __cstat + 205 + + + BICOMP + 803 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 306 + + + BICOMP + 753 306 836 640 818 816 693 681 678 714 801 711 663 583 670 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 579 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 307 + + + __cstat + 216 + + + BICOMP + 171 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 670 693 663 583 816 681 711 678 640 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 293 + + + __cstat + 574 + + + BICOMP + 514 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 681 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 763 + + + __cstat + 249 + + + BICOMP + 322 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 663 693 678 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 715 + + + __cstat + 259 + + + BICOMP + 585 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 308 + + + __cstat + 639 + + + BICOMP + 494 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 681 678 663 836 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 733 + + + __cstat + 241 + + + BICOMP + 486 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 839 + + + __cstat + 662 + + + BICOMP + 176 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 752 + + + __cstat + 575 + + + BICOMP + 492 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 496 + + + __cstat + 562 + + + BICOMP + 815 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 + + + BICOMP + 681 663 306 678 816 693 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 544 + + + __cstat + 576 + + + BICOMP + 323 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 681 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 680 + + + __cstat + 648 + + + BICOMP + 758 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 681 753 711 836 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 748 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 688 + + + __cstat + 560 + + + BICOMP + 796 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 663 306 678 816 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 265 + + + __cstat + 183 + + + BICOMP + 267 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 673 + + + __cstat + 549 + + + BICOMP + 519 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 + + + BICOMP + 663 306 681 678 816 693 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 296 + + + __cstat + 637 + + + BICOMP + 768 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 818 816 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 676 + + + __cstat + 193 + + + BICOMP + 141 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 612 + + + __cstat + 578 + + + BICOMP + 833 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 164 + + + __cstat + 660 + + + BICOMP + 491 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 681 753 711 836 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 489 + + + __cstat + 645 + + + BICOMP + 794 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 818 816 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 641 + + + __cstat + 571 + + + BICOMP + 269 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 816 306 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 310 + + + __cstat + 669 + + + BICOMP + 518 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 653 + + + __cstat + 234 + + + BICOMP + 606 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 + + + BICOMP + 753 711 836 681 818 816 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 315 + + + __cstat + 635 + + + BICOMP + 278 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 139 + + + BICOMP + 753 306 681 818 756 816 693 139 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 701 + + + __cstat + 568 + + + BICOMP + 156 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 139 + + + BICOMP + 818 139 681 693 711 753 816 306 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 162 + + + __cstat + 453 + + + BICOMP + 488 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 139 + + + BICOMP + 681 818 640 139 663 693 816 306 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 751 + + + __cstat + 559 + + + BICOMP + 696 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 302 + + + __cstat + 551 + + + BICOMP + 593 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 693 + + + BICOMP + 753 711 836 818 816 693 681 714 801 678 640 663 583 670 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 177 + + + __cstat + 548 + + + BICOMP + 720 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 753 681 818 139 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 831 + + + __cstat + 221 + + + BICOMP + 607 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 786 + + + __cstat + 652 + + + BICOMP + 835 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 836 306 + + + BICOMP + 678 663 836 681 816 306 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 707 + + + __cstat + 566 + + + BICOMP + 477 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 663 306 678 816 681 640 583 670 711 753 818 714 801 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 523 + + + __cstat + 223 + + + BICOMP + 266 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 654 + + + BICOMP + 306 681 714 663 756 711 753 816 693 654 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 526 + + + __cstat + 204 + + + BICOMP + 782 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 509 + + + BICOMP + 681 663 801 509 583 693 678 670 753 816 306 640 818 711 714 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 788 + + + __cstat + 212 + + + BICOMP + 684 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 681 714 663 654 711 753 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 154 + + + __cstat + 226 + + + BICOMP + 316 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 654 + + + BICOMP + 681 654 756 640 663 818 816 693 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 745 + + + __cstat + 250 + + + BICOMP + 524 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 681 753 759 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 318 + + + __cstat + 235 + + + BICOMP + 174 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 681 268 640 663 818 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 825 + + + __cstat + 256 + + + BICOMP + 142 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 654 + + + BICOMP + 681 663 801 654 583 693 678 670 753 816 306 640 818 711 714 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + __cstat + 224 + + + BICOMP + 736 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 714 663 509 711 753 816 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 155 + + + __cstat + 207 + + + BICOMP + 495 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 714 663 509 711 753 816 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 599 + + + __cstat + 236 + + + BICOMP + 594 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 753 818 139 816 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 158 + + + __cstat + 245 + + + BICOMP + 843 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 654 + + + BICOMP + 681 714 663 654 711 753 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 274 + + + __cstat + 247 + + + BICOMP + 633 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 306 693 759 + + + BICOMP + 681 663 801 693 583 756 678 670 753 816 306 759 640 818 711 714 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 775 + + + __cstat + 227 + + + BICOMP + 522 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 681 583 759 678 670 753 816 640 818 711 714 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 497 + + + __cstat + 232 + + + BICOMP + 309 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 753 759 681 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 159 + + + __cstat + 252 + + + BICOMP + 325 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 681 583 759 678 670 753 816 640 818 711 714 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 153 + + + __cstat + 646 + + + BICOMP + 664 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 753 759 681 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 270 + + + __cstat + 233 + + + BICOMP + 747 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 583 759 678 670 753 816 681 640 818 711 714 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 702 + + + __cstat + 222 + + + BICOMP + 317 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 268 + + + BICOMP + 681 268 640 663 818 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 632 + + + __cstat + 217 + + + BICOMP + 506 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 759 + + + BICOMP + 663 801 681 583 759 678 670 753 816 640 818 711 714 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 478 + + + __cstat + 558 + + + BICOMP + 598 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 545 + + + BICOMP + 753 306 818 756 816 693 545 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 627 + + + __cstat + 248 + + + BICOMP + 765 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 509 + + + BICOMP + 663 801 509 583 693 681 678 670 753 816 306 640 818 711 714 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 505 + + + __cstat + 567 + + + BICOMP + 195 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 545 + + + BICOMP + 681 818 640 545 663 693 816 306 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 735 + + + __cstat + 244 + + + BICOMP + 705 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 268 + + + BICOMP + 306 756 640 663 818 816 693 268 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 757 + + + __cstat + 196 + + + BICOMP + 538 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 654 + + + BICOMP + 306 714 663 756 711 753 816 693 654 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 272 + + + __cstat + 242 + + + BICOMP + 764 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 268 + + + BICOMP + 306 756 640 663 818 816 693 268 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 609 + + + __cstat + 636 + + + BICOMP + 742 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 693 759 + + + BICOMP + 753 759 681 818 306 816 693 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 547 + + + __cstat + 570 + + + BICOMP + 608 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 818 545 816 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 634 + + + __cstat + 211 + + + BICOMP + 487 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 509 + + + BICOMP + 681 714 663 509 711 753 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 138 + + + __cstat + 555 + + + BICOMP + 283 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 139 + + + BICOMP + 753 681 818 139 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 476 + + + __cstat + 246 + + + BICOMP + 610 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 268 + + + BICOMP + 306 756 681 640 663 818 816 693 268 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 166 + + + __cstat + 253 + + + BICOMP + 781 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 268 + + + BICOMP + 681 268 714 663 693 711 753 816 306 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 314 + + + __cstat + 260 + + + BICOMP + 146 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 509 + + + BICOMP + 681 306 714 663 756 711 753 816 693 509 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 689 + + + __cstat + 464 + + + BICOMP + 319 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 663 306 640 818 756 681 816 693 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 432 + + + __cstat + 553 + + + BICOMP + 800 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 644 + + + __cstat + 754 + + + BICOMP + 455 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 663 306 640 818 756 816 693 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 507 + + + __cstat + 806 + + + BICOMP + 778 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 753 711 663 306 714 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 148 + + + __cstat + 556 + + + BICOMP + 143 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 753 711 663 306 714 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 287 + + + __cstat + 642 + + + BICOMP + 734 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 306 + + + BICOMP + 681 753 711 663 306 714 816 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 826 + + + __cstat + 656 + + + BICOMP + 165 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 681 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 181 + + + __cstat + 643 + + + BICOMP + 324 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 816 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 484 + + + __cstat + 262 + + + BICOMP + 811 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 681 818 545 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 170 + + + __cstat + 572 + + + BICOMP + 320 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 816 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 481 + + + __cstat + 573 + + + BICOMP + 437 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 814 + + + __cstat + 564 + + + BICOMP + 699 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 681 818 545 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 500 + + + __cstat + 716 + + + BICOMP + 264 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 753 711 663 693 714 816 306 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 690 + + + __cstat + 239 + + + BICOMP + 630 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 545 + + + BICOMP + 818 640 545 663 693 816 306 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 769 + + + __cstat + 569 + + + BICOMP + 311 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 816 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 718 + + + __cstat + 667 + + + BICOMP + 779 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 681 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 502 + + + __cstat + 458 + + + BICOMP + 541 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 756 693 306 + + + BICOMP + 663 306 640 818 756 816 693 681 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 157 + + + __cstat + 554 + + + BICOMP + 178 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 306 + + + BICOMP + 753 711 663 693 714 816 306 681 818 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 600 + + + __cstat + 665 + + + BICOMP + 167 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 706 + + + __cstat + 647 + + + BICOMP + 603 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 818 545 816 681 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 301 + + + __cstat + 671 + + + BICOMP + 783 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 681 663 640 818 693 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 172 + + + __cstat + 565 + + + BICOMP + 721 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 545 + + + BICOMP + 753 681 818 545 816 711 714 663 678 640 583 670 801 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 750 + + + __cstat + 552 + + + BICOMP + 189 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 681 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 273 + + + __cstat + 621 + + + BICOMP + 313 + + + + + ICCARM + 816 681 678 753 663 583 527 670 818 714 711 801 640 693 + + + BICOMP + 663 640 818 693 681 816 678 583 670 753 801 711 714 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 299 808 540 727 279 187 817 263 286 730 687 532 685 543 440 740 694 677 151 791 743 820 683 294 813 546 276 709 275 537 479 581 586 602 771 137 150 712 180 617 584 580 300 686 823 168 703 145 614 452 795 321 284 191 655 161 525 147 429 190 780 827 628 182 767 292 516 785 821 312 588 601 713 280 304 179 724 520 173 430 784 579 307 615 597 624 140 842 539 797 291 770 485 625 723 508 587 282 515 804 841 772 188 557 760 613 807 265 831 308 786 293 544 673 641 763 748 752 707 751 688 496 296 715 733 676 612 839 302 680 164 489 310 653 701 315 162 177 138 599 735 272 166 318 702 476 314 526 627 634 155 490 523 825 757 788 158 154 274 745 632 497 775 159 153 609 270 547 478 505 690 484 172 814 706 502 718 170 481 181 750 769 157 600 301 273 826 432 148 689 644 507 500 287 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 539 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 924 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 485 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 842 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 282 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 307 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 515 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 925 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 291 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 770 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 723 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 508 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 615 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 624 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 587 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 140 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 597 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 724 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 520 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 588 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 516 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 173 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 147 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 145 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 780 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 655 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 525 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 452 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 628 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 161 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 767 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 191 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 785 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 429 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 703 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 190 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 292 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 821 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 312 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 182 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 280 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 924 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 614 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 795 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 321 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 827 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 922 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 304 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 179 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 284 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 926 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 826 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 301 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 181 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 769 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 148 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 644 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 689 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 481 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 157 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 750 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 432 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 500 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 273 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 507 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 287 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 600 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 314 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 272 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 177 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 735 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 166 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 318 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 315 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 162 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 701 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 925 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 702 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 310 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 476 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 599 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 653 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 138 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 300 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 150 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 932 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 740 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 168 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 602 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 925 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 137 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 791 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 617 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 820 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 813 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 275 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 546 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 180 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 584 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 479 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 580 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 686 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 823 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 294 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 694 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 709 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 677 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 683 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 151 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 276 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 586 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 924 927 925 922 926 921 931 928 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 771 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 537 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 921 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 712 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 931 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 743 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 929 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 579 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 797 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 804 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 713 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 784 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 748 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 601 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 581 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 924 927 931 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 625 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 430 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 540 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 730 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 727 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 687 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 685 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 808 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 263 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 543 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 817 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 440 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 286 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 299 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 279 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 932 928 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 532 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 927 929 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 187 + + + + + ICCARM + 930 975 678 753 663 583 527 670 818 714 711 801 640 992 991 928 + + + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m4/iar/example_build/tx.ewd b/ports/cortex_m4/iar/example_build/tx.ewd new file mode 100644 index 00000000..df7edfb3 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m4/iar/example_build/tx.ewp b/ports/cortex_m4/iar/example_build/tx.ewp new file mode 100644 index 00000000..1a1ad21d --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.ewp @@ -0,0 +1,2752 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m4/iar/example_build/tx.ewt b/ports/cortex_m4/iar/example_build/tx.ewt new file mode 100644 index 00000000..b13c96f7 --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx.ewt @@ -0,0 +1,3403 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m4/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m4/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..c252a33f --- /dev/null +++ b/ports/cortex_m4/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,176 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 25000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + ORR r1, r1, #1 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +__tx_SysTickHandler: +SysTick_Handler: +; +; VOID SysTick_Handler(VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, lr} + BX LR +; } + END + diff --git a/ports/cortex_m4/iar/inc/tx_port.h b/ports/cortex_m4/iar/inc/tx_port.h new file mode 100644 index 00000000..2aa60ea8 --- /dev/null +++ b/ports/cortex_m4/iar/inc/tx_port.h @@ -0,0 +1,493 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M4/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + +#ifdef __ARMVFP__ + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + __asm volatile ("vmov.f32 s0, s0"); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT)__CLZ(__RBIT((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define FPU extension for the Cortex-M4. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M4/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_m4/iar/readme_threadx.txt b/ports/cortex_m4/iar/readme_threadx.txt new file mode 100644 index 00000000..c6e7bb1f --- /dev/null +++ b/ports/cortex_m4/iar/readme_threadx.txt @@ -0,0 +1,224 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Using the IAR Tools + + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR debugger under +simulation. + +Building the demonstration is easy; simply open the threadx.www workspace file, +make the sample_threadx.ewp project the "active project" in the IAR Embedded +Workbench, and select the "Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary ELF file that can be downloaded and executed on the IAR Windows-based +Cortex-M4 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 s0 + 0x08 s1 + 0x0C s2 + 0x10 s3 + 0x14 s4 + 0x18 s5 + 0x1C s6 + 0x20 s7 + 0x24 s8 + 0x28 s9 + 0x2C s10 + 0x30 s11 + 0x34 s12 + 0x38 s13 + 0x3C s14 + 0x40 s15 + 0x44 s16 + 0x48 s17 + 0x4C s18 + 0x50 s19 + 0x54 s20 + 0x58 s21 + 0x5C s22 + 0x60 s23 + 0x64 s24 + 0x68 s25 + 0x6C s26 + 0x70 s27 + 0x74 s28 + 0x78 s29 + 0x7C s30 + 0x80 s31 + 0x84 fpscr + 0x88 r4 + 0x8C r5 + 0x90 r6 + 0x94 r7 + 0x98 r8 + 0x9C r9 + 0xA0 r10 (sl) + 0xA4 r11 + 0xA8 r0 (Hardware stack starts here!!) + 0xAC r1 + 0xB0 r2 + 0xB4 r3 + 0xB8 r12 + 0xBC lr + 0xC0 pc + 0xC4 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +The Cortex-M4 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.1 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {lr} + + ; ISR processing goes here, including any needed function calls. + + POP {lr} + BX lr + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. VFP Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M4 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/iar/src/tx_iar.c b/ports/cortex_m4/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m4/iar/src/tx_misra.s b/ports/cortex_m4/iar/src/tx_misra.s new file mode 100644 index 00000000..60ab3549 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_misra.s @@ -0,0 +1,1074 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** ThreadX MISRA Compliance */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + #define SHT_PROGBITS 0x1 + + EXTERN __aeabi_memset + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_interrupt_disable + EXTERN _tx_thread_interrupt_restore + EXTERN _tx_thread_stack_analyze + EXTERN _tx_thread_stack_error_handler + EXTERN _tx_thread_system_state +#ifdef TX_ENABLE_EVENT_TRACE + EXTERN _tx_trace_buffer_current_ptr + EXTERN _tx_trace_buffer_end_ptr + EXTERN _tx_trace_buffer_start_ptr + EXTERN _tx_trace_event_enable_bits + EXTERN _tx_trace_full_notify_function + EXTERN _tx_trace_header_ptr +#endif + + PUBLIC _tx_misra_always_true + PUBLIC _tx_misra_block_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_byte_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_char_to_uchar_pointer_convert + PUBLIC _tx_misra_const_char_to_char_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_entry_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_indirect_void_to_uchar_pointer_convert + PUBLIC _tx_misra_memset + PUBLIC _tx_misra_message_copy +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_object_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_pointer_to_ulong_convert + PUBLIC _tx_misra_status_get + PUBLIC _tx_misra_thread_stack_check +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_time_stamp_get +#endif + PUBLIC _tx_misra_timer_indirect_to_void_pointer_convert + PUBLIC _tx_misra_timer_pointer_add + PUBLIC _tx_misra_timer_pointer_dif +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_trace_event_insert +#endif + PUBLIC _tx_misra_uchar_pointer_add + PUBLIC _tx_misra_uchar_pointer_dif + PUBLIC _tx_misra_uchar_pointer_sub + PUBLIC _tx_misra_uchar_to_align_type_pointer_convert + PUBLIC _tx_misra_uchar_to_block_pool_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_entry_pointer_convert + PUBLIC _tx_misra_uchar_to_header_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_indirect_byte_pool_pointer_convert + PUBLIC _tx_misra_uchar_to_indirect_uchar_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_object_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_void_pointer_convert + PUBLIC _tx_misra_ulong_pointer_add + PUBLIC _tx_misra_ulong_pointer_dif + PUBLIC _tx_misra_ulong_pointer_sub + PUBLIC _tx_misra_ulong_to_pointer_convert + PUBLIC _tx_misra_ulong_to_thread_pointer_convert + PUBLIC _tx_misra_user_timer_pointer_get + PUBLIC _tx_misra_void_to_block_pool_pointer_convert + PUBLIC _tx_misra_void_to_byte_pool_pointer_convert + PUBLIC _tx_misra_void_to_event_flags_pointer_convert + PUBLIC _tx_misra_void_to_indirect_uchar_pointer_convert + PUBLIC _tx_misra_void_to_mutex_pointer_convert + PUBLIC _tx_misra_void_to_queue_pointer_convert + PUBLIC _tx_misra_void_to_semaphore_pointer_convert + PUBLIC _tx_misra_void_to_thread_pointer_convert + PUBLIC _tx_misra_void_to_uchar_pointer_convert + PUBLIC _tx_misra_void_to_ulong_pointer_convert + PUBLIC _tx_misra_ipsr_get + PUBLIC _tx_misra_control_get + PUBLIC _tx_misra_control_set +#ifdef __ARMVFP__ + PUBLIC _tx_misra_fpccr_get + PUBLIC _tx_misra_vfp_touch +#endif + PUBLIC _tx_version_id + + + SECTION `.data`:DATA:REORDER:NOROOT(2) + DATA +// 51 CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.0 MISRA C Compliant *"; +_tx_version_id: + DC8 43H, 6FH, 70H, 79H, 72H, 69H, 67H, 68H + DC8 74H, 20H, 28H, 63H, 29H, 20H, 31H, 39H + DC8 39H, 36H, 2DH, 32H, 30H, 31H, 38H, 20H + DC8 45H, 78H, 70H, 72H, 65H, 73H, 73H, 20H + DC8 4CH, 6FH, 67H, 69H, 63H, 20H, 49H, 6EH + DC8 63H, 2EH, 20H, 2AH, 20H, 54H, 68H, 72H + DC8 65H, 61H, 64H, 58H, 20H, 35H, 2EH, 38H + DC8 20H, 4DH, 49H, 53H, 52H, 41H, 20H, 43H + DC8 20H, 43H, 6FH, 6DH, 70H, 6CH, 69H, 61H + DC8 6EH, 74H, 20H, 2AH, 0 + DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_memset: + PUSH {R4,LR} + MOVS R4,R0 + MOVS R0,R2 + MOVS R2,R1 + MOVS R1,R0 + MOVS R0,R4 + BL __aeabi_memset + POP {R4,PC} ;; return + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_add: + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_sub: + RSBS R1,R1,#+0 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_dif: + SUBS R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_pointer_to_ulong_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_sub: + MVNS R2,#+3 + MULS R1,R2,R1 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ +/** UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_message_copy: + PUSH {R4,R5} + LDR R3,[R0, #+0] + LDR R4,[R1, #+0] + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + CMP R2,#+2 + BCC.N ??_tx_misra_message_copy_0 + SUBS R2,R2,#+1 + B.N ??_tx_misra_message_copy_1 +??_tx_misra_message_copy_2: + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + SUBS R2,R2,#+1 +??_tx_misra_message_copy_1: + CMP R2,#+0 + BNE.N ??_tx_misra_message_copy_2 +??_tx_misra_message_copy_0: + STR R3,[R0, #+0] + STR R4,[R1, #+0] + POP {R4,R5} + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ +/** TX_TIMER_INTERNAL **ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ +/** **ptr1, ULONG size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ +/** *internal_timer, TX_TIMER **user_timer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_user_timer_pointer_get: + ADDS R2,R0,#+8 + SUBS R2,R2,R0 + RSBS R2,R2,#+0 + ADD R0,R0,R2 + STR R0,[R1, #+0] + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ +/** VOID **highest_stack); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_thread_stack_check: + PUSH {R3-R5,LR} + MOVS R4,R0 + MOVS R5,R1 + BL _tx_thread_interrupt_disable + CMP R4,#+0 + BEQ.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+0] + LDR.N R2,??DataTable2 ;; 0x54485244 + CMP R1,R2 + BNE.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+8] + LDR R2,[R5, #+0] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_1 + LDR R1,[R4, #+8] + STR R1,[R5, #+0] +??_tx_misra_thread_stack_check_1: + LDR R1,[R4, #+12] + LDR R1,[R1, #+0] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R4, #+16] + LDR R1,[R1, #+1] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R5, #+0] + LDR R2,[R4, #+12] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_3 +??_tx_misra_thread_stack_check_2: + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_error_handler + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_3: + LDR R1,[R5, #+0] + LDR R1,[R1, #-4] + CMP R1,#-269488145 + BEQ.N ??_tx_misra_thread_stack_check_0 + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_analyze + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_0: + BL _tx_thread_interrupt_restore + POP {R0,R4,R5,PC} ;; return + +#ifdef TX_ENABLE_EVENT_TRACE + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_trace_event_insert(ULONG event_id, */ +/** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ +/** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_trace_event_insert: + PUSH {R3-R7,LR} + LDR.N R4,??DataTable2_1 + LDR R4,[R4, #+0] + CMP R4,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_2 + LDR R5,[R5, #+0] + LDR R6,[SP, #+28] + TST R5,R6 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_3 + LDR R5,[R5, #+0] + LDR.N R6,??DataTable2_4 + LDR R6,[R6, #+0] + CMP R5,#+0 + BNE.N ??_tx_misra_trace_event_insert_1 + LDR R5,[R6, #+44] + LDR R7,[R6, #+60] + LSLS R7,R7,#+16 + ORRS R7,R7,#0x80000000 + ORRS R5,R7,R5 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_1: + CMP R5,#-252645136 + BCS.N ??_tx_misra_trace_event_insert_3 + MOVS R5,R6 + MOVS R6,#-1 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_3: + MOVS R6,#-252645136 + MOVS R5,#+0 +??_tx_misra_trace_event_insert_2: + STR R6,[R4, #+0] + STR R5,[R4, #+4] + STR R0,[R4, #+8] + LDR R0,[SP, #+32] + STR R0,[R4, #+12] + STR R1,[R4, #+16] + STR R2,[R4, #+20] + STR R3,[R4, #+24] + LDR R0,[SP, #+24] + STR R0,[R4, #+28] + ADDS R4,R4,#+32 + LDR.N R0,??DataTable2_5 + LDR R0,[R0, #+0] + CMP R4,R0 + BCC.N ??_tx_misra_trace_event_insert_4 + LDR.N R0,??DataTable2_6 + LDR R4,[R0, #+0] + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] + LDR.N R0,??DataTable2_8 + LDR R0,[R0, #+0] + CMP R0,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + LDR.N R1,??DataTable2_8 + LDR R1,[R1, #+0] + BLX R1 + B.N ??_tx_misra_trace_event_insert_0 +??_tx_misra_trace_event_insert_4: + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] +??_tx_misra_trace_event_insert_0: + POP {R0,R4-R7,PC} ;; return + + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_1: + DC32 _tx_trace_buffer_current_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_2: + DC32 _tx_trace_event_enable_bits + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_5: + DC32 _tx_trace_buffer_end_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_6: + DC32 _tx_trace_buffer_start_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_7: + DC32 _tx_trace_header_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_8: + DC32 _tx_trace_full_notify_function + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_time_stamp_get(VOID); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_time_stamp_get: + MOVS R0,#+0 + BX LR ;; return + +#endif + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2: + DC32 0x54485244 + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_3: + DC32 _tx_thread_system_state + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_4: + DC32 _tx_thread_current_ptr + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_always_true(void); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_always_true: + MOVS R0,#+1 + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_indirect_void_to_uchar_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************/ +/***********************************************************************************/ +/** */ +/** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ +/** */ +/***********************************************************************************/ +/***********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_block_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_block_pool_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************/ +/************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************/ +/************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_block_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************/ +/**************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************/ +/**************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_byte_pool_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_byte_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_align_type_pointer_convert: + BX LR ;; return + + +/****************************************************************************************************/ +/****************************************************************************************************/ +/** */ +/** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/****************************************************************************************************/ +/****************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_byte_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************************/ +/**************************************************************************************************/ +/** */ +/** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************************/ +/**************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_event_flags_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_ulong_pointer_convert: + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_mutex_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_status_get(UINT status); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_status_get: + MOVS R0,#+0 + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_queue_pointer_convert: + BX LR ;; return + + +/****************************************************************************************/ +/****************************************************************************************/ +/** */ +/** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ +/** */ +/****************************************************************************************/ +/****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_semaphore_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_void_pointer_convert: + BX LR ;; return + + +/*********************************************************************************/ +/*********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ +/** */ +/*********************************************************************************/ +/*********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_thread_pointer_convert: + BX LR ;; return + + +/***************************************************************************************************/ +/***************************************************************************************************/ +/** */ +/** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ +/** */ +/***************************************************************************************************/ +/***************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_indirect_to_void_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_const_char_to_char_pointer_convert: + BX LR ;; return + + +/**********************************************************************************/ +/**********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ +/** */ +/**********************************************************************************/ +/**********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_thread_pointer_convert: + BX LR ;; return + + +#ifdef TX_ENABLE_EVENT_TRACE + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_object_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_object_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_header_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_entry_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_entry_to_uchar_pointer_convert: + BX LR ;; return +#endif + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_char_to_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_ipsr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ipsr_get: + MRS R0, IPSR + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_control_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_get: + MRS R0, CONTROL + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_control_set(ULONG value); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_set: + MSR CONTROL, R0 + BX LR ;; return + + +#ifdef __ARMVFP__ + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_fpccr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(2) + THUMB +_tx_misra_fpccr_get: + LDR r0, =0xE000EF34 ; Build FPCCR address + LDR r0, [r0] ; Load FPCCR value + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_vfp_touch(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_vfp_touch: + vmov.f32 s0, s0 + BX LR ;; return + +#endif + + + SECTION `.iar_vfe_header`:DATA:NOALLOC:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA + DC32 0 + + END diff --git a/ports/cortex_m4/iar/src/tx_thread_context_restore.s b/ports/cortex_m4/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1930c870 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_context_restore.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* [_tx_execution_isr_exit] Execution profiling ISR exit */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0, lr} ; Save return address +#endif +; + POP {lr} + BX lr +; +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_context_save.s b/ports/cortex_m4/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..ab563506 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_context_save.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover return address +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END diff --git a/ports/cortex_m4/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m4/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..e04f8ceb --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..7807d5c8 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..2159ae40 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m4/iar/src/tx_thread_schedule.s b/ports/cortex_m4/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..df0e74b2 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_schedule.s @@ -0,0 +1,291 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; +#ifdef __ARMVFP__ + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register +#endif +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context PendSV handler. */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts +#endif + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save: +#endif + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore: +#endif + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread +;} +; +#ifdef __ARMVFP__ + + PUBLIC tx_thread_fpu_enable +tx_thread_fpu_enable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + PUBLIC tx_thread_fpu_disable +tx_thread_fpu_disable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + +#endif + + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_stack_build.s b/ports/cortex_m4/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..61b86ab9 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_stack_build.s @@ -0,0 +1,144 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_thread_system_return.s b/ports/cortex_m4/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..9820752e --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_thread_system_return.s @@ -0,0 +1,98 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/iar/src/tx_timer_interrupt.s b/ports/cortex_m4/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..0a3c3e52 --- /dev/null +++ b/ports/cortex_m4/iar/src/tx_timer_interrupt.s @@ -0,0 +1,268 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* expiration functions are called. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired: +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt new file mode 100644 index 00000000..8586e313 --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvopt @@ -0,0 +1,305 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Demo + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGDARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0) + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(152=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + -T5F + + + 0 + UL2CM3 + -UV0289BJE -O14 -S0 -C0 -N00("ARM CoreSight JTAG-DP") -D00(3BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_16 -FS00 -FL04000 + + + + + + 0 + 1 + thread_0_counter + + + 1 + 1 + thread_1_counter + + + 2 + 1 + thread_2_counter + + + 3 + 1 + thread_3_counter + + + 4 + 1 + thread_4_counter + + + 5 + 1 + thread_5_counter + + + 6 + 1 + _tx_thread_current_ptr + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + .\tx_initialize_low_level.s + tx_initialize_low_level.s + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + .\demo_threadx.c + demo_threadx.c + 0 + 0 + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 56 + 12 + 1633 + 671 + + + + + + + Library_Group + 1 + 0 + 0 + 0 + + 2 + 3 + 4 + 0 + 0 + 0 + .\ThreadX_Library.lib + ThreadX_Library.lib + 0 + 0 + + + +
diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj new file mode 100644 index 00000000..269fe86a --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Demo.uvproj @@ -0,0 +1,573 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Demo + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M4 FPU + ARM + CLOCK(12000000) CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2 + + + + 5237 + + + + + + + + + + + + 0 + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\ + threadx_demo + 1 + 0 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM4F + SARMCM3.DLL + + TCM.DLL + -pCM4F + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 4096 + + 0 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ../inc;../../../../common/inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + --first __tx_vectors --entry=__main + + + + + + + + Source Group + + + 0 + 1 + 1 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 0 + + + + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + tx_initialize_low_level.s + 2 + .\tx_initialize_low_level.s + + + 2 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 2 + 2 + 0 + + + + + + + + + + + + demo_threadx.c + 1 + .\demo_threadx.c + + + + + Library_Group + + + ThreadX_Library.lib + 4 + .\ThreadX_Library.lib + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Library.plg b/ports/cortex_m4/keil/example_build/ThreadX_Library.plg new file mode 100644 index 00000000..725a791b --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Library.plg @@ -0,0 +1,203 @@ + + +
+

µVision Build Log

+

Project:

+C:\release\threadx\ThreadX_Library.uvproj +Project File Date: 06/28/2012 + +

Output:

+Build target 'ThreadX_Library_Project' +compiling txe_timer_info_get.c... +compiling tx_block_allocate.c... +compiling tx_block_pool_cleanup.c... +compiling tx_block_pool_create.c... +compiling tx_block_pool_delete.c... +compiling tx_block_pool_info_get.c... +compiling tx_block_pool_initialize.c... +compiling tx_block_pool_performance_info_get.c... +compiling tx_block_pool_performance_system_info_get.c... +compiling tx_block_pool_prioritize.c... +compiling tx_block_release.c... +compiling tx_byte_allocate.c... +compiling tx_byte_pool_cleanup.c... +compiling tx_byte_pool_create.c... +compiling tx_byte_pool_delete.c... +compiling tx_byte_pool_info_get.c... +compiling tx_byte_pool_initialize.c... +compiling tx_byte_pool_performance_info_get.c... +compiling tx_byte_pool_performance_system_info_get.c... +compiling tx_byte_pool_prioritize.c... +compiling tx_byte_pool_search.c... +compiling tx_byte_release.c... +compiling tx_event_flags_cleanup.c... +compiling tx_event_flags_create.c... +compiling tx_event_flags_delete.c... +compiling tx_event_flags_get.c... +compiling tx_event_flags_info_get.c... +compiling tx_event_flags_initialize.c... +compiling tx_event_flags_performance_info_get.c... +compiling tx_event_flags_performance_system_info_get.c... +compiling tx_event_flags_set.c... +compiling tx_event_flags_set_notify.c... +compiling tx_initialize_high_level.c... +compiling tx_initialize_kernel_enter.c... +compiling tx_initialize_kernel_setup.c... +compiling tx_mutex_cleanup.c... +compiling tx_mutex_create.c... +compiling tx_mutex_delete.c... +compiling tx_mutex_get.c... +compiling tx_mutex_info_get.c... +compiling tx_mutex_initialize.c... +compiling tx_mutex_performance_info_get.c... +compiling tx_mutex_performance_system_info_get.c... +compiling tx_mutex_prioritize.c... +compiling tx_mutex_priority_change.c... +compiling tx_mutex_put.c... +compiling tx_queue_cleanup.c... +compiling tx_queue_create.c... +compiling tx_queue_delete.c... +compiling tx_queue_flush.c... +compiling tx_queue_front_send.c... +compiling tx_queue_info_get.c... +compiling tx_queue_initialize.c... +compiling tx_queue_performance_info_get.c... +compiling tx_queue_performance_system_info_get.c... +compiling tx_queue_prioritize.c... +compiling tx_queue_receive.c... +compiling tx_queue_send.c... +compiling tx_queue_send_notify.c... +compiling tx_semaphore_ceiling_put.c... +compiling tx_semaphore_cleanup.c... +compiling tx_semaphore_create.c... +compiling tx_semaphore_delete.c... +compiling tx_semaphore_get.c... +compiling tx_semaphore_info_get.c... +compiling tx_semaphore_initialize.c... +compiling tx_semaphore_performance_info_get.c... +compiling tx_semaphore_performance_system_info_get.c... +compiling tx_semaphore_prioritize.c... +compiling tx_semaphore_put.c... +compiling tx_semaphore_put_notify.c... +compiling tx_thread_create.c... +compiling tx_thread_delete.c... +compiling tx_thread_entry_exit_notify.c... +compiling tx_thread_identify.c... +compiling tx_thread_info_get.c... +compiling tx_thread_initialize.c... +compiling tx_thread_performance_info_get.c... +compiling tx_thread_performance_system_info_get.c... +compiling tx_thread_preemption_change.c... +compiling tx_thread_priority_change.c... +compiling tx_thread_relinquish.c... +compiling tx_thread_reset.c... +compiling tx_thread_resume.c... +compiling tx_thread_shell_entry.c... +compiling tx_thread_sleep.c... +compiling tx_thread_stack_analyze.c... +compiling tx_thread_stack_error_handler.c... +compiling tx_thread_stack_error_notify.c... +compiling tx_thread_suspend.c... +compiling tx_thread_system_preempt_check.c... +compiling tx_thread_system_resume.c... +compiling tx_thread_system_suspend.c... +compiling tx_thread_terminate.c... +compiling tx_thread_time_slice.c... +compiling tx_thread_time_slice_change.c... +compiling tx_thread_timeout.c... +compiling tx_thread_wait_abort.c... +compiling tx_time_get.c... +compiling tx_time_set.c... +compiling tx_timer_activate.c... +compiling tx_timer_change.c... +compiling tx_timer_create.c... +compiling tx_timer_deactivate.c... +compiling tx_timer_delete.c... +compiling tx_timer_expiration_process.c... +compiling tx_timer_info_get.c... +compiling tx_timer_initialize.c... +compiling tx_timer_performance_info_get.c... +compiling tx_timer_performance_system_info_get.c... +compiling tx_timer_system_activate.c... +compiling tx_timer_system_deactivate.c... +compiling tx_timer_thread_entry.c... +compiling tx_trace_disable.c... +compiling tx_trace_enable.c... +compiling tx_trace_initialize.c... +compiling tx_trace_interrupt_control.c... +compiling tx_trace_isr_enter_insert.c... +compiling tx_trace_isr_exit_insert.c... +compiling tx_trace_object_register.c... +compiling tx_trace_object_unregister.c... +compiling tx_trace_user_event_insert.c... +compiling txe_block_allocate.c... +compiling txe_block_pool_create.c... +compiling txe_block_pool_delete.c... +compiling txe_block_pool_info_get.c... +compiling txe_block_pool_prioritize.c... +compiling txe_block_release.c... +compiling txe_byte_allocate.c... +compiling txe_byte_pool_create.c... +compiling txe_byte_pool_delete.c... +compiling txe_byte_pool_info_get.c... +compiling txe_byte_pool_prioritize.c... +compiling txe_byte_release.c... +compiling txe_event_flags_create.c... +compiling txe_event_flags_delete.c... +compiling txe_event_flags_get.c... +compiling txe_event_flags_info_get.c... +compiling txe_event_flags_set.c... +compiling txe_event_flags_set_notify.c... +compiling txe_mutex_create.c... +compiling txe_mutex_delete.c... +compiling txe_mutex_get.c... +compiling txe_mutex_info_get.c... +compiling txe_mutex_prioritize.c... +compiling txe_mutex_put.c... +compiling txe_queue_create.c... +compiling txe_queue_delete.c... +compiling txe_queue_flush.c... +compiling txe_queue_front_send.c... +compiling txe_queue_info_get.c... +compiling txe_queue_prioritize.c... +compiling txe_queue_receive.c... +compiling txe_queue_send.c... +compiling txe_queue_send_notify.c... +compiling txe_semaphore_ceiling_put.c... +compiling txe_semaphore_create.c... +compiling txe_semaphore_delete.c... +compiling txe_semaphore_get.c... +compiling txe_semaphore_info_get.c... +compiling txe_semaphore_prioritize.c... +compiling txe_semaphore_put.c... +compiling txe_semaphore_put_notify.c... +compiling txe_thread_create.c... +compiling txe_thread_delete.c... +compiling txe_thread_entry_exit_notify.c... +compiling txe_thread_info_get.c... +compiling txe_thread_preemption_change.c... +compiling txe_thread_priority_change.c... +compiling txe_thread_relinquish.c... +compiling txe_thread_reset.c... +compiling txe_thread_resume.c... +compiling txe_thread_suspend.c... +compiling txe_thread_terminate.c... +compiling txe_thread_time_slice_change.c... +compiling txe_thread_wait_abort.c... +compiling txe_timer_activate.c... +compiling txe_timer_change.c... +compiling txe_timer_create.c... +compiling txe_timer_deactivate.c... +compiling txe_timer_delete.c... +assembling tx_timer_interrupt.s... +assembling tx_thread_context_restore.s... +assembling tx_thread_context_save.s... +assembling tx_thread_interrupt_control.s... +assembling tx_thread_schedule.s... +assembling tx_thread_stack_build.s... +assembling tx_thread_system_return.s... +compiling tx_trace_buffer_full_notify.c... +compiling tx_trace_event_filter.c... +compiling tx_trace_event_unfilter.c... +creating Library... +"ThreadX_Library.lib" - 0 Error(s), 0 Warning(s). diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt new file mode 100644 index 00000000..8205883f --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvopt @@ -0,0 +1,2664 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + ThreadX_Library_Project + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 5 + + + + + + + + + + + BIN\ULP2CM3.DLL + + + + 0 + ULP2CM3 + -O2510 -S0 -C0 -FO15 -FD20000000 -FC4000 -FN1 -FF0MK_P256 -FS00 -FL040000) + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + + + + Source Group + 0 + 0 + 0 + 0 + + 1 + 1 + 5 + 0 + 0 + 0 + ..\inc\tx_port.h + tx_port.h + 0 + 0 + + + 1 + 2 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_restore.s + tx_thread_context_restore.s + 0 + 0 + + + 1 + 3 + 2 + 0 + 0 + 0 + ..\src\tx_thread_context_save.s + tx_thread_context_save.s + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_control.s + tx_thread_interrupt_control.s + 0 + 0 + + + 1 + 5 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_disable.s + tx_thread_interrupt_disable.s + 0 + 0 + + + 1 + 6 + 2 + 0 + 0 + 0 + ..\src\tx_thread_interrupt_restore.s + tx_thread_interrupt_restore.s + 0 + 0 + + + 1 + 7 + 2 + 0 + 0 + 0 + ..\src\tx_thread_schedule.s + tx_thread_schedule.s + 0 + 0 + + + 1 + 8 + 2 + 0 + 0 + 0 + ..\src\tx_thread_stack_build.s + tx_thread_stack_build.s + 0 + 0 + + + 1 + 9 + 2 + 0 + 0 + 0 + ..\src\tx_thread_system_return.s + tx_thread_system_return.s + 0 + 0 + + + 1 + 10 + 2 + 0 + 0 + 0 + ..\src\tx_timer_interrupt.s + tx_timer_interrupt.s + 0 + 0 + + + 1 + 11 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_api.h + tx_api.h + 0 + 0 + + + 1 + 12 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_block_pool.h + tx_block_pool.h + 0 + 0 + + + 1 + 13 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_byte_pool.h + tx_byte_pool.h + 0 + 0 + + + 1 + 14 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_event_flags.h + tx_event_flags.h + 0 + 0 + + + 1 + 15 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_initialize.h + tx_initialize.h + 0 + 0 + + + 1 + 16 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_mutex.h + tx_mutex.h + 0 + 0 + + + 1 + 17 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_queue.h + tx_queue.h + 0 + 0 + + + 1 + 18 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_semaphore.h + tx_semaphore.h + 0 + 0 + + + 1 + 19 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_thread.h + tx_thread.h + 0 + 0 + + + 1 + 20 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_timer.h + tx_timer.h + 0 + 0 + + + 1 + 21 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_trace.h + tx_trace.h + 0 + 0 + + + 1 + 22 + 5 + 0 + 0 + 0 + ..\..\..\..\common\inc\tx_user.h + tx_user.h + 0 + 0 + + + 1 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_allocate.c + tx_block_allocate.c + 0 + 0 + + + 1 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + tx_block_pool_cleanup.c + 0 + 0 + + + 1 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_create.c + tx_block_pool_create.c + 0 + 0 + + + 1 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_delete.c + tx_block_pool_delete.c + 0 + 0 + + + 1 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_info_get.c + tx_block_pool_info_get.c + 0 + 0 + + + 1 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_initialize.c + tx_block_pool_initialize.c + 0 + 0 + + + 1 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + tx_block_pool_performance_info_get.c + 0 + 0 + + + 1 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + tx_block_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + tx_block_pool_prioritize.c + 0 + 0 + + + 1 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_block_release.c + tx_block_release.c + 0 + 0 + + + 1 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_allocate.c + tx_byte_allocate.c + 0 + 0 + + + 1 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + tx_byte_pool_cleanup.c + 0 + 0 + + + 1 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_create.c + tx_byte_pool_create.c + 0 + 0 + + + 1 + 36 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_delete.c + tx_byte_pool_delete.c + 0 + 0 + + + 1 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + tx_byte_pool_info_get.c + 0 + 0 + + + 1 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + tx_byte_pool_initialize.c + 0 + 0 + + + 1 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + tx_byte_pool_performance_info_get.c + 0 + 0 + + + 1 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + tx_byte_pool_performance_system_info_get.c + 0 + 0 + + + 1 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + tx_byte_pool_prioritize.c + 0 + 0 + + + 1 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_pool_search.c + tx_byte_pool_search.c + 0 + 0 + + + 1 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_byte_release.c + tx_byte_release.c + 0 + 0 + + + 1 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + tx_event_flags_cleanup.c + 0 + 0 + + + 1 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_create.c + tx_event_flags_create.c + 0 + 0 + + + 1 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_delete.c + tx_event_flags_delete.c + 0 + 0 + + + 1 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_get.c + tx_event_flags_get.c + 0 + 0 + + + 1 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_info_get.c + tx_event_flags_info_get.c + 0 + 0 + + + 1 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_initialize.c + tx_event_flags_initialize.c + 0 + 0 + + + 1 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + tx_event_flags_performance_info_get.c + 0 + 0 + + + 1 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + tx_event_flags_performance_system_info_get.c + 0 + 0 + + + 1 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set.c + tx_event_flags_set.c + 0 + 0 + + + 1 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + tx_event_flags_set_notify.c + 0 + 0 + + + 1 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_high_level.c + tx_initialize_high_level.c + 0 + 0 + + + 1 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + tx_initialize_kernel_enter.c + 0 + 0 + + + 1 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + tx_initialize_kernel_setup.c + 0 + 0 + + + 1 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_misra.c + tx_misra.c + 0 + 0 + + + 1 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_cleanup.c + tx_mutex_cleanup.c + 0 + 0 + + + 1 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_create.c + tx_mutex_create.c + 0 + 0 + + + 1 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_delete.c + tx_mutex_delete.c + 0 + 0 + + + 1 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_get.c + tx_mutex_get.c + 0 + 0 + + + 1 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_info_get.c + tx_mutex_info_get.c + 0 + 0 + + + 1 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_initialize.c + tx_mutex_initialize.c + 0 + 0 + + + 1 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + tx_mutex_performance_info_get.c + 0 + 0 + + + 1 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + tx_mutex_performance_system_info_get.c + 0 + 0 + + + 1 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_prioritize.c + tx_mutex_prioritize.c + 0 + 0 + + + 1 + 67 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_priority_change.c + tx_mutex_priority_change.c + 0 + 0 + + + 1 + 68 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_mutex_put.c + tx_mutex_put.c + 0 + 0 + + + 1 + 69 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_cleanup.c + tx_queue_cleanup.c + 0 + 0 + + + 1 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_create.c + tx_queue_create.c + 0 + 0 + + + 1 + 71 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_delete.c + tx_queue_delete.c + 0 + 0 + + + 1 + 72 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_flush.c + tx_queue_flush.c + 0 + 0 + + + 1 + 73 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_front_send.c + tx_queue_front_send.c + 0 + 0 + + + 1 + 74 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_info_get.c + tx_queue_info_get.c + 0 + 0 + + + 1 + 75 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_initialize.c + tx_queue_initialize.c + 0 + 0 + + + 1 + 76 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + tx_queue_performance_info_get.c + 0 + 0 + + + 1 + 77 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + tx_queue_performance_system_info_get.c + 0 + 0 + + + 1 + 78 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_prioritize.c + tx_queue_prioritize.c + 0 + 0 + + + 1 + 79 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_receive.c + tx_queue_receive.c + 0 + 0 + + + 1 + 80 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send.c + tx_queue_send.c + 0 + 0 + + + 1 + 81 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_queue_send_notify.c + tx_queue_send_notify.c + 0 + 0 + + + 1 + 82 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + tx_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 83 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + tx_semaphore_cleanup.c + 0 + 0 + + + 1 + 84 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_create.c + tx_semaphore_create.c + 0 + 0 + + + 1 + 85 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_delete.c + tx_semaphore_delete.c + 0 + 0 + + + 1 + 86 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_get.c + tx_semaphore_get.c + 0 + 0 + + + 1 + 87 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_info_get.c + tx_semaphore_info_get.c + 0 + 0 + + + 1 + 88 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_initialize.c + tx_semaphore_initialize.c + 0 + 0 + + + 1 + 89 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + tx_semaphore_performance_info_get.c + 0 + 0 + + + 1 + 90 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + tx_semaphore_performance_system_info_get.c + 0 + 0 + + + 1 + 91 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + tx_semaphore_prioritize.c + 0 + 0 + + + 1 + 92 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put.c + tx_semaphore_put.c + 0 + 0 + + + 1 + 93 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + tx_semaphore_put_notify.c + 0 + 0 + + + 1 + 94 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_create.c + tx_thread_create.c + 0 + 0 + + + 1 + 95 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_delete.c + tx_thread_delete.c + 0 + 0 + + + 1 + 96 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + tx_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 97 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_identify.c + tx_thread_identify.c + 0 + 0 + + + 1 + 98 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_info_get.c + tx_thread_info_get.c + 0 + 0 + + + 1 + 99 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_initialize.c + tx_thread_initialize.c + 0 + 0 + + + 1 + 100 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + tx_thread_performance_info_get.c + 0 + 0 + + + 1 + 101 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + tx_thread_performance_system_info_get.c + 0 + 0 + + + 1 + 102 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_preemption_change.c + tx_thread_preemption_change.c + 0 + 0 + + + 1 + 103 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_priority_change.c + tx_thread_priority_change.c + 0 + 0 + + + 1 + 104 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_relinquish.c + tx_thread_relinquish.c + 0 + 0 + + + 1 + 105 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_reset.c + tx_thread_reset.c + 0 + 0 + + + 1 + 106 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_resume.c + tx_thread_resume.c + 0 + 0 + + + 1 + 107 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_shell_entry.c + tx_thread_shell_entry.c + 0 + 0 + + + 1 + 108 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_sleep.c + tx_thread_sleep.c + 0 + 0 + + + 1 + 109 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + tx_thread_stack_analyze.c + 0 + 0 + + + 1 + 110 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + tx_thread_stack_error_handler.c + 0 + 0 + + + 1 + 111 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + tx_thread_stack_error_notify.c + 0 + 0 + + + 1 + 112 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_suspend.c + tx_thread_suspend.c + 0 + 0 + + + 1 + 113 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + tx_thread_system_preempt_check.c + 0 + 0 + + + 1 + 114 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_resume.c + tx_thread_system_resume.c + 0 + 0 + + + 1 + 115 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_system_suspend.c + tx_thread_system_suspend.c + 0 + 0 + + + 1 + 116 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_terminate.c + tx_thread_terminate.c + 0 + 0 + + + 1 + 117 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice.c + tx_thread_time_slice.c + 0 + 0 + + + 1 + 118 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + tx_thread_time_slice_change.c + 0 + 0 + + + 1 + 119 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_timeout.c + tx_thread_timeout.c + 0 + 0 + + + 1 + 120 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_thread_wait_abort.c + tx_thread_wait_abort.c + 0 + 0 + + + 1 + 121 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_get.c + tx_time_get.c + 0 + 0 + + + 1 + 122 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_time_set.c + tx_time_set.c + 0 + 0 + + + 1 + 123 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_activate.c + tx_timer_activate.c + 0 + 0 + + + 1 + 124 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_change.c + tx_timer_change.c + 0 + 0 + + + 1 + 125 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_create.c + tx_timer_create.c + 0 + 0 + + + 1 + 126 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_deactivate.c + tx_timer_deactivate.c + 0 + 0 + + + 1 + 127 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_delete.c + tx_timer_delete.c + 0 + 0 + + + 1 + 128 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_expiration_process.c + tx_timer_expiration_process.c + 0 + 0 + + + 1 + 129 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_info_get.c + tx_timer_info_get.c + 0 + 0 + + + 1 + 130 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_initialize.c + tx_timer_initialize.c + 0 + 0 + + + 1 + 131 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + tx_timer_performance_info_get.c + 0 + 0 + + + 1 + 132 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + tx_timer_performance_system_info_get.c + 0 + 0 + + + 1 + 133 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_activate.c + tx_timer_system_activate.c + 0 + 0 + + + 1 + 134 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + tx_timer_system_deactivate.c + 0 + 0 + + + 1 + 135 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_timer_thread_entry.c + tx_timer_thread_entry.c + 0 + 0 + + + 1 + 136 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + tx_trace_buffer_full_notify.c + 0 + 0 + + + 1 + 137 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_disable.c + tx_trace_disable.c + 0 + 0 + + + 1 + 138 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_enable.c + tx_trace_enable.c + 0 + 0 + + + 1 + 139 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_filter.c + tx_trace_event_filter.c + 0 + 0 + + + 1 + 140 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + tx_trace_event_unfilter.c + 0 + 0 + + + 1 + 141 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_initialize.c + tx_trace_initialize.c + 0 + 0 + + + 1 + 142 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + tx_trace_interrupt_control.c + 0 + 0 + + + 1 + 143 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + tx_trace_isr_enter_insert.c + 0 + 0 + + + 1 + 144 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + tx_trace_isr_exit_insert.c + 0 + 0 + + + 1 + 145 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_register.c + tx_trace_object_register.c + 0 + 0 + + + 1 + 146 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_object_unregister.c + tx_trace_object_unregister.c + 0 + 0 + + + 1 + 147 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + tx_trace_user_event_insert.c + 0 + 0 + + + 1 + 148 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_allocate.c + txe_block_allocate.c + 0 + 0 + + + 1 + 149 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_create.c + txe_block_pool_create.c + 0 + 0 + + + 1 + 150 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_delete.c + txe_block_pool_delete.c + 0 + 0 + + + 1 + 151 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_info_get.c + txe_block_pool_info_get.c + 0 + 0 + + + 1 + 152 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + txe_block_pool_prioritize.c + 0 + 0 + + + 1 + 153 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_block_release.c + txe_block_release.c + 0 + 0 + + + 1 + 154 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_allocate.c + txe_byte_allocate.c + 0 + 0 + + + 1 + 155 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_create.c + txe_byte_pool_create.c + 0 + 0 + + + 1 + 156 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_delete.c + txe_byte_pool_delete.c + 0 + 0 + + + 1 + 157 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + txe_byte_pool_info_get.c + 0 + 0 + + + 1 + 158 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + txe_byte_pool_prioritize.c + 0 + 0 + + + 1 + 159 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_byte_release.c + txe_byte_release.c + 0 + 0 + + + 1 + 160 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_create.c + txe_event_flags_create.c + 0 + 0 + + + 1 + 161 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_delete.c + txe_event_flags_delete.c + 0 + 0 + + + 1 + 162 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_get.c + txe_event_flags_get.c + 0 + 0 + + + 1 + 163 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_info_get.c + txe_event_flags_info_get.c + 0 + 0 + + + 1 + 164 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set.c + txe_event_flags_set.c + 0 + 0 + + + 1 + 165 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + txe_event_flags_set_notify.c + 0 + 0 + + + 1 + 166 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_create.c + txe_mutex_create.c + 0 + 0 + + + 1 + 167 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_delete.c + txe_mutex_delete.c + 0 + 0 + + + 1 + 168 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_get.c + txe_mutex_get.c + 0 + 0 + + + 1 + 169 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_info_get.c + txe_mutex_info_get.c + 0 + 0 + + + 1 + 170 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_prioritize.c + txe_mutex_prioritize.c + 0 + 0 + + + 1 + 171 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_mutex_put.c + txe_mutex_put.c + 0 + 0 + + + 1 + 172 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_create.c + txe_queue_create.c + 0 + 0 + + + 1 + 173 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_delete.c + txe_queue_delete.c + 0 + 0 + + + 1 + 174 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_flush.c + txe_queue_flush.c + 0 + 0 + + + 1 + 175 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_front_send.c + txe_queue_front_send.c + 0 + 0 + + + 1 + 176 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_info_get.c + txe_queue_info_get.c + 0 + 0 + + + 1 + 177 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_prioritize.c + txe_queue_prioritize.c + 0 + 0 + + + 1 + 178 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_receive.c + txe_queue_receive.c + 0 + 0 + + + 1 + 179 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send.c + txe_queue_send.c + 0 + 0 + + + 1 + 180 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_queue_send_notify.c + txe_queue_send_notify.c + 0 + 0 + + + 1 + 181 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + txe_semaphore_ceiling_put.c + 0 + 0 + + + 1 + 182 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_create.c + txe_semaphore_create.c + 0 + 0 + + + 1 + 183 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_delete.c + txe_semaphore_delete.c + 0 + 0 + + + 1 + 184 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_get.c + txe_semaphore_get.c + 0 + 0 + + + 1 + 185 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_info_get.c + txe_semaphore_info_get.c + 0 + 0 + + + 1 + 186 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + txe_semaphore_prioritize.c + 0 + 0 + + + 1 + 187 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put.c + txe_semaphore_put.c + 0 + 0 + + + 1 + 188 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + txe_semaphore_put_notify.c + 0 + 0 + + + 1 + 189 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_create.c + txe_thread_create.c + 0 + 0 + + + 1 + 190 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_delete.c + txe_thread_delete.c + 0 + 0 + + + 1 + 191 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + txe_thread_entry_exit_notify.c + 0 + 0 + + + 1 + 192 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_info_get.c + txe_thread_info_get.c + 0 + 0 + + + 1 + 193 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_preemption_change.c + txe_thread_preemption_change.c + 0 + 0 + + + 1 + 194 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_priority_change.c + txe_thread_priority_change.c + 0 + 0 + + + 1 + 195 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_relinquish.c + txe_thread_relinquish.c + 0 + 0 + + + 1 + 196 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_reset.c + txe_thread_reset.c + 0 + 0 + + + 1 + 197 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_resume.c + txe_thread_resume.c + 0 + 0 + + + 1 + 198 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_suspend.c + txe_thread_suspend.c + 0 + 0 + + + 1 + 199 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_terminate.c + txe_thread_terminate.c + 0 + 0 + + + 1 + 200 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + txe_thread_time_slice_change.c + 0 + 0 + + + 1 + 201 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_thread_wait_abort.c + txe_thread_wait_abort.c + 0 + 0 + + + 1 + 202 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_activate.c + txe_timer_activate.c + 0 + 0 + + + 1 + 203 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_change.c + txe_timer_change.c + 0 + 0 + + + 1 + 204 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_create.c + txe_timer_create.c + 0 + 0 + + + 1 + 205 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_deactivate.c + txe_timer_deactivate.c + 0 + 0 + + + 1 + 206 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_delete.c + txe_timer_delete.c + 0 + 0 + + + 1 + 207 + 1 + 0 + 0 + 0 + ..\..\..\..\common\src\txe_timer_info_get.c + txe_timer_info_get.c + 0 + 0 + + + +
diff --git a/ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj new file mode 100644 index 00000000..5c577681 --- /dev/null +++ b/ports/cortex_m4/keil/example_build/ThreadX_Library.uvproj @@ -0,0 +1,1481 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + ThreadX_Library_Project + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::.\ARMCC + 0 + + + Cortex-M4 FPU + ARM + CLOCK(12000000) CPUTYPE("Cortex-M4") ESEL ELITTLE FPU2 + + + + 5237 + + + + + + + + + + + + 0 + 0 + + + + Freescale\K60\ + Freescale\K60\ + + 0 + 0 + 0 + 0 + 1 + + .\ + ThreadX_Library + 0 + 1 + 0 + 1 + 1 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM4 + SARMCM3.DLL + + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + + 0 + 5 + + + + + + + + + + + + + + BIN\ULP2CM3.DLL + + + + + 1 + 0 + 0 + 0 + 1 + 4100 + + 0 + BIN\ULP2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x1fff8000 + 0x8000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + + 0 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + ../inc;../../../../common/inc + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + TX_ENABLE_WFI + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + + + + + + + + + + Source Group + + + tx_port.h + 5 + ..\inc\tx_port.h + + + tx_thread_context_restore.s + 2 + ..\src\tx_thread_context_restore.s + + + tx_thread_context_save.s + 2 + ..\src\tx_thread_context_save.s + + + tx_thread_interrupt_control.s + 2 + ..\src\tx_thread_interrupt_control.s + + + tx_thread_interrupt_disable.s + 2 + ..\src\tx_thread_interrupt_disable.s + + + tx_thread_interrupt_restore.s + 2 + ..\src\tx_thread_interrupt_restore.s + + + tx_thread_schedule.s + 2 + ..\src\tx_thread_schedule.s + + + tx_thread_stack_build.s + 2 + ..\src\tx_thread_stack_build.s + + + tx_thread_system_return.s + 2 + ..\src\tx_thread_system_return.s + + + tx_timer_interrupt.s + 2 + ..\src\tx_timer_interrupt.s + + + tx_api.h + 5 + ..\..\..\..\common\inc\tx_api.h + + + tx_block_pool.h + 5 + ..\..\..\..\common\inc\tx_block_pool.h + + + tx_byte_pool.h + 5 + ..\..\..\..\common\inc\tx_byte_pool.h + + + tx_event_flags.h + 5 + ..\..\..\..\common\inc\tx_event_flags.h + + + tx_initialize.h + 5 + ..\..\..\..\common\inc\tx_initialize.h + + + tx_mutex.h + 5 + ..\..\..\..\common\inc\tx_mutex.h + + + tx_queue.h + 5 + ..\..\..\..\common\inc\tx_queue.h + + + tx_semaphore.h + 5 + ..\..\..\..\common\inc\tx_semaphore.h + + + tx_thread.h + 5 + ..\..\..\..\common\inc\tx_thread.h + + + tx_timer.h + 5 + ..\..\..\..\common\inc\tx_timer.h + + + tx_trace.h + 5 + ..\..\..\..\common\inc\tx_trace.h + + + tx_user.h + 5 + ..\..\..\..\common\inc\tx_user.h + + + tx_block_allocate.c + 1 + ..\..\..\..\common\src\tx_block_allocate.c + + + tx_block_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_block_pool_cleanup.c + + + tx_block_pool_create.c + 1 + ..\..\..\..\common\src\tx_block_pool_create.c + + + tx_block_pool_delete.c + 1 + ..\..\..\..\common\src\tx_block_pool_delete.c + + + tx_block_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_info_get.c + + + tx_block_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_block_pool_initialize.c + + + tx_block_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + tx_block_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + tx_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_block_pool_prioritize.c + + + tx_block_release.c + 1 + ..\..\..\..\common\src\tx_block_release.c + + + tx_byte_allocate.c + 1 + ..\..\..\..\common\src\tx_byte_allocate.c + + + tx_byte_pool_cleanup.c + 1 + ..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + tx_byte_pool_create.c + 1 + ..\..\..\..\common\src\tx_byte_pool_create.c + + + tx_byte_pool_delete.c + 1 + ..\..\..\..\common\src\tx_byte_pool_delete.c + + + tx_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_info_get.c + + + tx_byte_pool_initialize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_initialize.c + + + tx_byte_pool_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + tx_byte_pool_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + tx_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + tx_byte_pool_search.c + 1 + ..\..\..\..\common\src\tx_byte_pool_search.c + + + tx_byte_release.c + 1 + ..\..\..\..\common\src\tx_byte_release.c + + + tx_event_flags_cleanup.c + 1 + ..\..\..\..\common\src\tx_event_flags_cleanup.c + + + tx_event_flags_create.c + 1 + ..\..\..\..\common\src\tx_event_flags_create.c + + + tx_event_flags_delete.c + 1 + ..\..\..\..\common\src\tx_event_flags_delete.c + + + tx_event_flags_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_get.c + + + tx_event_flags_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_info_get.c + + + tx_event_flags_initialize.c + 1 + ..\..\..\..\common\src\tx_event_flags_initialize.c + + + tx_event_flags_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + tx_event_flags_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + tx_event_flags_set.c + 1 + ..\..\..\..\common\src\tx_event_flags_set.c + + + tx_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\tx_event_flags_set_notify.c + + + tx_initialize_high_level.c + 1 + ..\..\..\..\common\src\tx_initialize_high_level.c + + + tx_initialize_kernel_enter.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + tx_initialize_kernel_setup.c + 1 + ..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + tx_misra.c + 1 + ..\..\..\..\common\src\tx_misra.c + + + tx_mutex_cleanup.c + 1 + ..\..\..\..\common\src\tx_mutex_cleanup.c + + + tx_mutex_create.c + 1 + ..\..\..\..\common\src\tx_mutex_create.c + + + tx_mutex_delete.c + 1 + ..\..\..\..\common\src\tx_mutex_delete.c + + + tx_mutex_get.c + 1 + ..\..\..\..\common\src\tx_mutex_get.c + + + tx_mutex_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_info_get.c + + + tx_mutex_initialize.c + 1 + ..\..\..\..\common\src\tx_mutex_initialize.c + + + tx_mutex_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + tx_mutex_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + tx_mutex_prioritize.c + 1 + ..\..\..\..\common\src\tx_mutex_prioritize.c + + + tx_mutex_priority_change.c + 1 + ..\..\..\..\common\src\tx_mutex_priority_change.c + + + tx_mutex_put.c + 1 + ..\..\..\..\common\src\tx_mutex_put.c + + + tx_queue_cleanup.c + 1 + ..\..\..\..\common\src\tx_queue_cleanup.c + + + tx_queue_create.c + 1 + ..\..\..\..\common\src\tx_queue_create.c + + + tx_queue_delete.c + 1 + ..\..\..\..\common\src\tx_queue_delete.c + + + tx_queue_flush.c + 1 + ..\..\..\..\common\src\tx_queue_flush.c + + + tx_queue_front_send.c + 1 + ..\..\..\..\common\src\tx_queue_front_send.c + + + tx_queue_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_info_get.c + + + tx_queue_initialize.c + 1 + ..\..\..\..\common\src\tx_queue_initialize.c + + + tx_queue_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_info_get.c + + + tx_queue_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + tx_queue_prioritize.c + 1 + ..\..\..\..\common\src\tx_queue_prioritize.c + + + tx_queue_receive.c + 1 + ..\..\..\..\common\src\tx_queue_receive.c + + + tx_queue_send.c + 1 + ..\..\..\..\common\src\tx_queue_send.c + + + tx_queue_send_notify.c + 1 + ..\..\..\..\common\src\tx_queue_send_notify.c + + + tx_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + tx_semaphore_cleanup.c + 1 + ..\..\..\..\common\src\tx_semaphore_cleanup.c + + + tx_semaphore_create.c + 1 + ..\..\..\..\common\src\tx_semaphore_create.c + + + tx_semaphore_delete.c + 1 + ..\..\..\..\common\src\tx_semaphore_delete.c + + + tx_semaphore_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_get.c + + + tx_semaphore_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_info_get.c + + + tx_semaphore_initialize.c + 1 + ..\..\..\..\common\src\tx_semaphore_initialize.c + + + tx_semaphore_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + tx_semaphore_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + tx_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\tx_semaphore_prioritize.c + + + tx_semaphore_put.c + 1 + ..\..\..\..\common\src\tx_semaphore_put.c + + + tx_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\tx_semaphore_put_notify.c + + + tx_thread_create.c + 1 + ..\..\..\..\common\src\tx_thread_create.c + + + tx_thread_delete.c + 1 + ..\..\..\..\common\src\tx_thread_delete.c + + + tx_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + tx_thread_identify.c + 1 + ..\..\..\..\common\src\tx_thread_identify.c + + + tx_thread_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_info_get.c + + + tx_thread_initialize.c + 1 + ..\..\..\..\common\src\tx_thread_initialize.c + + + tx_thread_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_info_get.c + + + tx_thread_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + tx_thread_preemption_change.c + 1 + ..\..\..\..\common\src\tx_thread_preemption_change.c + + + tx_thread_priority_change.c + 1 + ..\..\..\..\common\src\tx_thread_priority_change.c + + + tx_thread_relinquish.c + 1 + ..\..\..\..\common\src\tx_thread_relinquish.c + + + tx_thread_reset.c + 1 + ..\..\..\..\common\src\tx_thread_reset.c + + + tx_thread_resume.c + 1 + ..\..\..\..\common\src\tx_thread_resume.c + + + tx_thread_shell_entry.c + 1 + ..\..\..\..\common\src\tx_thread_shell_entry.c + + + tx_thread_sleep.c + 1 + ..\..\..\..\common\src\tx_thread_sleep.c + + + tx_thread_stack_analyze.c + 1 + ..\..\..\..\common\src\tx_thread_stack_analyze.c + + + tx_thread_stack_error_handler.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + tx_thread_stack_error_notify.c + 1 + ..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + tx_thread_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_suspend.c + + + tx_thread_system_preempt_check.c + 1 + ..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + tx_thread_system_resume.c + 1 + ..\..\..\..\common\src\tx_thread_system_resume.c + + + tx_thread_system_suspend.c + 1 + ..\..\..\..\common\src\tx_thread_system_suspend.c + + + tx_thread_terminate.c + 1 + ..\..\..\..\common\src\tx_thread_terminate.c + + + tx_thread_time_slice.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice.c + + + tx_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\tx_thread_time_slice_change.c + + + tx_thread_timeout.c + 1 + ..\..\..\..\common\src\tx_thread_timeout.c + + + tx_thread_wait_abort.c + 1 + ..\..\..\..\common\src\tx_thread_wait_abort.c + + + tx_time_get.c + 1 + ..\..\..\..\common\src\tx_time_get.c + + + tx_time_set.c + 1 + ..\..\..\..\common\src\tx_time_set.c + + + tx_timer_activate.c + 1 + ..\..\..\..\common\src\tx_timer_activate.c + + + tx_timer_change.c + 1 + ..\..\..\..\common\src\tx_timer_change.c + + + tx_timer_create.c + 1 + ..\..\..\..\common\src\tx_timer_create.c + + + tx_timer_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_deactivate.c + + + tx_timer_delete.c + 1 + ..\..\..\..\common\src\tx_timer_delete.c + + + tx_timer_expiration_process.c + 1 + ..\..\..\..\common\src\tx_timer_expiration_process.c + + + tx_timer_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_info_get.c + + + tx_timer_initialize.c + 1 + ..\..\..\..\common\src\tx_timer_initialize.c + + + tx_timer_performance_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_info_get.c + + + tx_timer_performance_system_info_get.c + 1 + ..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + tx_timer_system_activate.c + 1 + ..\..\..\..\common\src\tx_timer_system_activate.c + + + tx_timer_system_deactivate.c + 1 + ..\..\..\..\common\src\tx_timer_system_deactivate.c + + + tx_timer_thread_entry.c + 1 + ..\..\..\..\common\src\tx_timer_thread_entry.c + + + tx_trace_buffer_full_notify.c + 1 + ..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + tx_trace_disable.c + 1 + ..\..\..\..\common\src\tx_trace_disable.c + + + tx_trace_enable.c + 1 + ..\..\..\..\common\src\tx_trace_enable.c + + + tx_trace_event_filter.c + 1 + ..\..\..\..\common\src\tx_trace_event_filter.c + + + tx_trace_event_unfilter.c + 1 + ..\..\..\..\common\src\tx_trace_event_unfilter.c + + + tx_trace_initialize.c + 1 + ..\..\..\..\common\src\tx_trace_initialize.c + + + tx_trace_interrupt_control.c + 1 + ..\..\..\..\common\src\tx_trace_interrupt_control.c + + + tx_trace_isr_enter_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + tx_trace_isr_exit_insert.c + 1 + ..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + tx_trace_object_register.c + 1 + ..\..\..\..\common\src\tx_trace_object_register.c + + + tx_trace_object_unregister.c + 1 + ..\..\..\..\common\src\tx_trace_object_unregister.c + + + tx_trace_user_event_insert.c + 1 + ..\..\..\..\common\src\tx_trace_user_event_insert.c + + + txe_block_allocate.c + 1 + ..\..\..\..\common\src\txe_block_allocate.c + + + txe_block_pool_create.c + 1 + ..\..\..\..\common\src\txe_block_pool_create.c + + + txe_block_pool_delete.c + 1 + ..\..\..\..\common\src\txe_block_pool_delete.c + + + txe_block_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_block_pool_info_get.c + + + txe_block_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_block_pool_prioritize.c + + + txe_block_release.c + 1 + ..\..\..\..\common\src\txe_block_release.c + + + txe_byte_allocate.c + 1 + ..\..\..\..\common\src\txe_byte_allocate.c + + + txe_byte_pool_create.c + 1 + ..\..\..\..\common\src\txe_byte_pool_create.c + + + txe_byte_pool_delete.c + 1 + ..\..\..\..\common\src\txe_byte_pool_delete.c + + + txe_byte_pool_info_get.c + 1 + ..\..\..\..\common\src\txe_byte_pool_info_get.c + + + txe_byte_pool_prioritize.c + 1 + ..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + txe_byte_release.c + 1 + ..\..\..\..\common\src\txe_byte_release.c + + + txe_event_flags_create.c + 1 + ..\..\..\..\common\src\txe_event_flags_create.c + + + txe_event_flags_delete.c + 1 + ..\..\..\..\common\src\txe_event_flags_delete.c + + + txe_event_flags_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_get.c + + + txe_event_flags_info_get.c + 1 + ..\..\..\..\common\src\txe_event_flags_info_get.c + + + txe_event_flags_set.c + 1 + ..\..\..\..\common\src\txe_event_flags_set.c + + + txe_event_flags_set_notify.c + 1 + ..\..\..\..\common\src\txe_event_flags_set_notify.c + + + txe_mutex_create.c + 1 + ..\..\..\..\common\src\txe_mutex_create.c + + + txe_mutex_delete.c + 1 + ..\..\..\..\common\src\txe_mutex_delete.c + + + txe_mutex_get.c + 1 + ..\..\..\..\common\src\txe_mutex_get.c + + + txe_mutex_info_get.c + 1 + ..\..\..\..\common\src\txe_mutex_info_get.c + + + txe_mutex_prioritize.c + 1 + ..\..\..\..\common\src\txe_mutex_prioritize.c + + + txe_mutex_put.c + 1 + ..\..\..\..\common\src\txe_mutex_put.c + + + txe_queue_create.c + 1 + ..\..\..\..\common\src\txe_queue_create.c + + + txe_queue_delete.c + 1 + ..\..\..\..\common\src\txe_queue_delete.c + + + txe_queue_flush.c + 1 + ..\..\..\..\common\src\txe_queue_flush.c + + + txe_queue_front_send.c + 1 + ..\..\..\..\common\src\txe_queue_front_send.c + + + txe_queue_info_get.c + 1 + ..\..\..\..\common\src\txe_queue_info_get.c + + + txe_queue_prioritize.c + 1 + ..\..\..\..\common\src\txe_queue_prioritize.c + + + txe_queue_receive.c + 1 + ..\..\..\..\common\src\txe_queue_receive.c + + + txe_queue_send.c + 1 + ..\..\..\..\common\src\txe_queue_send.c + + + txe_queue_send_notify.c + 1 + ..\..\..\..\common\src\txe_queue_send_notify.c + + + txe_semaphore_ceiling_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + txe_semaphore_create.c + 1 + ..\..\..\..\common\src\txe_semaphore_create.c + + + txe_semaphore_delete.c + 1 + ..\..\..\..\common\src\txe_semaphore_delete.c + + + txe_semaphore_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_get.c + + + txe_semaphore_info_get.c + 1 + ..\..\..\..\common\src\txe_semaphore_info_get.c + + + txe_semaphore_prioritize.c + 1 + ..\..\..\..\common\src\txe_semaphore_prioritize.c + + + txe_semaphore_put.c + 1 + ..\..\..\..\common\src\txe_semaphore_put.c + + + txe_semaphore_put_notify.c + 1 + ..\..\..\..\common\src\txe_semaphore_put_notify.c + + + txe_thread_create.c + 1 + ..\..\..\..\common\src\txe_thread_create.c + + + txe_thread_delete.c + 1 + ..\..\..\..\common\src\txe_thread_delete.c + + + txe_thread_entry_exit_notify.c + 1 + ..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + txe_thread_info_get.c + 1 + ..\..\..\..\common\src\txe_thread_info_get.c + + + txe_thread_preemption_change.c + 1 + ..\..\..\..\common\src\txe_thread_preemption_change.c + + + txe_thread_priority_change.c + 1 + ..\..\..\..\common\src\txe_thread_priority_change.c + + + txe_thread_relinquish.c + 1 + ..\..\..\..\common\src\txe_thread_relinquish.c + + + txe_thread_reset.c + 1 + ..\..\..\..\common\src\txe_thread_reset.c + + + txe_thread_resume.c + 1 + ..\..\..\..\common\src\txe_thread_resume.c + + + txe_thread_suspend.c + 1 + ..\..\..\..\common\src\txe_thread_suspend.c + + + txe_thread_terminate.c + 1 + ..\..\..\..\common\src\txe_thread_terminate.c + + + txe_thread_time_slice_change.c + 1 + ..\..\..\..\common\src\txe_thread_time_slice_change.c + + + txe_thread_wait_abort.c + 1 + ..\..\..\..\common\src\txe_thread_wait_abort.c + + + txe_timer_activate.c + 1 + ..\..\..\..\common\src\txe_timer_activate.c + + + txe_timer_change.c + 1 + ..\..\..\..\common\src\txe_timer_change.c + + + txe_timer_create.c + 1 + ..\..\..\..\common\src\txe_timer_create.c + + + txe_timer_deactivate.c + 1 + ..\..\..\..\common\src\txe_timer_deactivate.c + + + txe_timer_delete.c + 1 + ..\..\..\..\common\src\txe_timer_delete.c + + + txe_timer_info_get.c + 1 + ..\..\..\..\common\src\txe_timer_info_get.c + + + + + + + + + + + <Project Info> + + + + + + 0 + 1 + + + + +
diff --git a/ports/cortex_m4/keil/example_build/demo_threadx.c b/ports/cortex_m4/keil/example_build/demo_threadx.c new file mode 100644 index 00000000..9b94bcd4 --- /dev/null +++ b/ports/cortex_m4/keil/example_build/demo_threadx.c @@ -0,0 +1,262 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of six + threads of different priorities, using a message queue, semaphore, and an event flags group. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_QUEUE_SIZE 10 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_EVENT_FLAGS_GROUP event_flags_0; + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; + + +/* Define the thread stacks. */ + +UCHAR thread_0_stack[DEMO_STACK_SIZE]; +UCHAR thread_1_stack[DEMO_STACK_SIZE]; +UCHAR thread_2_stack[DEMO_STACK_SIZE]; +UCHAR thread_3_stack[DEMO_STACK_SIZE]; +UCHAR thread_4_stack[DEMO_STACK_SIZE]; +UCHAR thread_5_stack[DEMO_STACK_SIZE]; + + +/* Define the queue area. */ + +UCHAR queue_0_area[DEMO_QUEUE_SIZE*sizeof(ULONG)]; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); + + +volatile unsigned int bootloop; + +/* Define main entry point. */ + + + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + + + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + thread_0_stack, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + thread_1_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + thread_2_stack, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + thread_3_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + thread_4_stack, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + thread_5_stack, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, queue_0_area, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} diff --git a/ports/cortex_m4/keil/example_build/tx_initialize_low_level.s b/ports/cortex_m4/keil/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..de11bafb --- /dev/null +++ b/ports/cortex_m4/keil/example_build/tx_initialize_low_level.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, =0xE000ED88 ; Pickup address of CPACR + LDR r1, [r0] ; Pickup CPACR + MOV32 r2, 0x00F00000 ; Build enable value + ORR r1, r1, r2 ; Or in enable value + STR r1, [r0] ; Setup CPACR + ENDIF + LDR r0, =__main + BX r0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M4/RVDS */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =HeapMem + LDR r1, =(StackMem + STACK_SIZE) + LDR r2, =(HeapMem + HEAP_SIZE) + LDR r3, =StackMem + BX lr +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END diff --git a/ports/cortex_m4/keil/inc/tx_port.h b/ports/cortex_m4/keil/inc/tx_port.h new file mode 100644 index 00000000..7474585b --- /dev/null +++ b/ports/cortex_m4/keil/inc/tx_port.h @@ -0,0 +1,471 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M4/Keil */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +#ifdef __TARGET_FPU_VFP + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#else + +#ifdef TX_SOURCE_CODE + +register ULONG _control __asm("control"); + +#endif +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +void _tx_vfp_access(void); + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_vfp_access(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + +/* Define FPU extension for the Cortex-M4. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M4/Keil Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m4/keil/readme_threadx.txt b/ports/cortex_m4/keil/readme_threadx.txt new file mode 100644 index 00000000..188eb21d --- /dev/null +++ b/ports/cortex_m4/keil/readme_threadx.txt @@ -0,0 +1,208 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M4 + + Thumb & 32-bit Mode + + Using the Keil Microcontroller Development Kit + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy, simply load the project file +ThreadX_Library.Uv2, which is located inside the "example_build" directory. + +Once the ThreadX library files are displayed in the project window, +select the "Build Target" operation and observe the compilation and assembly +of the ThreadX library. This project build produces the ThreadX library +file ThreadX_Library.lib. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the Keil debugger or +Cortex-M4 hardware. This demonstration is slightly smaller than typical ThreadX +demonstrations, and thus requires less than 7KB of Flash and less than 4KB of RAM. + +Building the demonstration is easy; simply open the ThreadX demonstration +project file ThreadX_Demo.Uv2, which is located inside the "example_build" +directory. + +Once open, select the "Build Target" operation and observe the compilation of +sample_threadx.c (which is the demonstration application) and linking with +ThreadX_Library.lib. The resulting file sample_threadx.axf is a binary file that +can be downloaded and executed on Cortex-M4 hardware. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M4 using Keil tools is at label +__main. This is defined within the Keil compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M4 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 s0 + 0x04 s1 + 0x08 s2 + 0x0C s3 + 0x10 s4 + 0x14 s5 + 0x18 s6 + 0x1C s7 + 0x20 s8 + 0x24 s9 + 0x28 s10 + 0x2C s11 + 0x30 s12 + 0x34 s13 + 0x38 s14 + 0x3C s15 + 0x40 s16 + 0x44 s17 + 0x48 s18 + 0x4C s19 + 0x50 s20 + 0x54 s21 + 0x58 s22 + 0x5C s23 + 0x60 s24 + 0x64 s25 + 0x68 s26 + 0x6C s27 + 0x70 s28 + 0x74 s29 + 0x78 s30 + 0x7C s31 + 0x80 fpscr + 0x84 r4 + 0x88 r5 + 0x8C r6 + 0x90 r7 + 0x94 r8 + 0x98 r9 + 0x9C r10 (sl) + 0xA0 r11 + 0xA4 r0 (Hardware stack starts here!!) + 0xA8 r1 + 0xAC r2 + 0xB0 r3 + 0xB4 r12 + 0xB8 lr + 0xBC pc + 0xC0 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M4 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. FPU Support + +ThreadX for Cortex-M4 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M4 using Keil tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m4/keil/src/tx_thread_context_restore.s b/ports/cortex_m4/keil/src/tx_thread_context_restore.s new file mode 100644 index 00000000..7c54ab4e --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_context_restore.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/keil/src/tx_thread_context_save.s b/ports/cortex_m4/keil/src/tx_thread_context_save.s new file mode 100644 index 00000000..268b05a9 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_context_save.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m4/keil/src/tx_thread_interrupt_control.s b/ports/cortex_m4/keil/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..a5889c6e --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_interrupt_control.s @@ -0,0 +1,85 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s b/ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..3cf2a68c --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s b/ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..20447958 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m4/keil/src/tx_thread_schedule.s b/ports/cortex_m4/keil/src/tx_thread_schedule.s new file mode 100644 index 00000000..fd29b203 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_schedule.s @@ -0,0 +1,298 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; + IF {TARGET_FPU_VFP} = {TRUE} + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register + ENDIF +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save + ENDIF + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore + ENDIF + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_fpu_enable +tx_thread_fpu_enable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT tx_thread_fpu_disable +tx_thread_fpu_disable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT _tx_vfp_access +_tx_vfp_access + VMOV.F32 s0, s0 ; Simply access the VFP + BX lr ; Return to caller + + + ENDIF + + ALIGN + LTORG + END + diff --git a/ports/cortex_m4/keil/src/tx_thread_stack_build.s b/ports/cortex_m4/keil/src/tx_thread_stack_build.s new file mode 100644 index 00000000..aa2f9d4d --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_stack_build.s @@ -0,0 +1,143 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M4 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/keil/src/tx_thread_system_return.s b/ports/cortex_m4/keil/src/tx_thread_system_return.s new file mode 100644 index 00000000..1e9c99a8 --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_thread_system_return.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m4/keil/src/tx_timer_interrupt.s b/ports/cortex_m4/keil/src/tx_timer_interrupt.s new file mode 100644 index 00000000..3a53a2ee --- /dev/null +++ b/ports/cortex_m4/keil/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/ac5/example_build/build_threadx.bat b/ports/cortex_m7/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..89656d39 --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/build_threadx.bat @@ -0,0 +1,230 @@ +del tx.a +armasm -g --cpu=cortex-m7 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-m7 --apcs=interwork ../src/tx_timer_interrupt.s +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-m7 -Otime -O2 -Odiv -c --data_reorder -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m7/ac5/example_build/build_threadx_sample.bat b/ports/cortex_m7/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..e964baa0 --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-m7 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-m7 -O2 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first __tx_vectors --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_m7/ac5/example_build/sample_threadx.c b/ports/cortex_m7/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..439b0d8b --- /dev/null +++ b/ports/cortex_m7/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,272 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT |Image$$RO$$Limit| + IMPORT |Image$$RW$$Base| + IMPORT |Image$$ZI$$Base| + IMPORT |Image$$ZI$$Limit| + IMPORT __tx_PendSVHandler +; +; +SYSTEM_CLOCK EQU 6000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) +; +; +;/* Setup the stack and heap areas. */ +; +STACK_SIZE EQU 0x00000400 +HEAP_SIZE EQU 0x00000000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE STACK_SIZE +__initial_sp + + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE HEAP_SIZE +__heap_limit + + + AREA RESET, CODE, READONLY +; + EXPORT __tx_vectors +__tx_vectors + DCD __initial_sp ; Reset and system stack ptr + DCD Reset_Handler ; Reset goes to startup function + DCD __tx_NMIHandler ; NMI + DCD __tx_BadHandler ; HardFault + DCD 0 ; MemManage + DCD 0 ; BusFault + DCD 0 ; UsageFault + DCD 0 ; 7 + DCD 0 ; 8 + DCD 0 ; 9 + DCD 0 ; 10 + DCD __tx_SVCallHandler ; SVCall + DCD __tx_DBGHandler ; Monitor + DCD 0 ; 13 + DCD __tx_PendSVHandler ; PendSV + DCD __tx_SysTickHandler ; SysTick + DCD __tx_IntHandler ; Int 0 + DCD __tx_IntHandler ; Int 1 + DCD __tx_IntHandler ; Int 2 + DCD __tx_IntHandler ; Int 3 + +; +; + AREA ||.text||, CODE, READONLY + EXPORT Reset_Handler +Reset_Handler + CPSID i + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, =0xE000ED88 ; Pickup address of CPACR + LDR r1, [r0] ; Pickup CPACR + MOV32 r2, 0x00F00000 ; Build enable value + ORR r1, r1, r2 ; Or in enable value + STR r1, [r0] ; Setup CPACR + ENDIF + LDR r0, =__main + BX r0 + + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; /* Disable interrupts during ThreadX initialization. */ +; + CPSID i +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =_tx_initialize_unused_memory ; Build address of unused memory pointer + LDR r1, =|Image$$ZI$$Limit| ; Build first free address + ADD r1, r1, #4 ; + STR r1, [r0] ; Setup first unused memory pointer +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__tx_vectors ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Enable the cycle count register. */ +; +; LDR r0, =0xE0001000 ; Build address of DWT register +; LDR r1, [r0] ; Pickup the current value +; ORR r1, r1, #1 ; Set the CYCCNTENA bit +; STR r1, [r0] ; Enable the cycle count register +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__tx_vectors ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; +;/* Define initial heap/stack routine for the ARM RVCT startup code. +; This routine will set the initial stack and heap locations */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =HeapMem + LDR r1, =(StackMem + STACK_SIZE) + LDR r2, =(HeapMem + HEAP_SIZE) + LDR r3, =StackMem + BX lr +; +; +;/* Define shells for each of the unused vectors. */ +; + EXPORT __tx_BadHandler +__tx_BadHandler + B __tx_BadHandler + + EXPORT __tx_SVCallHandler +__tx_SVCallHandler + B __tx_SVCallHandler + + EXPORT __tx_IntHandler +__tx_IntHandler +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* .... */ + + POP {r0, lr} + BX LR +; } + + EXPORT __tx_SysTickHandler +__tx_SysTickHandler +; VOID TimerInterruptHandler (VOID) +; { +; + PUSH {r0, lr} + BL _tx_timer_interrupt + POP {r0, lr} + BX LR +; } + + EXPORT __tx_NMIHandler +__tx_NMIHandler + B __tx_NMIHandler + + EXPORT __tx_DBGHandler +__tx_DBGHandler + B __tx_DBGHandler + + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/ac5/inc/tx_port.h b/ports/cortex_m7/ac5/inc/tx_port.h new file mode 100644 index 00000000..57480ebb --- /dev/null +++ b/ports/cortex_m7/ac5/inc/tx_port.h @@ -0,0 +1,471 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M7/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) + + +#ifndef TX_MISRA_ENABLE + +register unsigned int _ipsr __asm("ipsr"); + +#endif + + +#ifdef __TARGET_FPU_VFP + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#else + +#ifdef TX_SOURCE_CODE + +register ULONG _control __asm("control"); + +#endif +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +void _tx_vfp_access(void); + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_vfp_access(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _control; \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _control = _tx_vfp_state; \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _ipsr) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT) __clz(__rbit((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int was_masked; +#define TX_DISABLE was_masked = __disable_irq(); +#define TX_RESTORE if (was_masked == 0) __enable_irq(); + +#define _tx_thread_system_return _tx_thread_system_return_inline + + +static void _tx_thread_system_return_inline(void) +{ +unsigned int was_masked; + + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (_ipsr == 0) + { + was_masked = __disable_irq(); + __enable_irq(); + if (was_masked != 0) + __disable_irq(); + } +} +#endif + + +/* Define FPU extension for the Cortex-M7. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M7/AC5 Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + diff --git a/ports/cortex_m7/ac5/readme_threadx.txt b/ports/cortex_m7/ac5/readme_threadx.txt new file mode 100644 index 00000000..4cf8c2da --- /dev/null +++ b/ports/cortex_m7/ac5/readme_threadx.txt @@ -0,0 +1,207 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M7 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the AC5 +compiler. At this point you may run the build_threadx.bat batch file. This will +build the ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM DS Cortex-M7 +simulator. + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM DS Cortex-M7 +simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M7 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M7 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 s0 + 0x04 s1 + 0x08 s2 + 0x0C s3 + 0x10 s4 + 0x14 s5 + 0x18 s6 + 0x1C s7 + 0x20 s8 + 0x24 s9 + 0x28 s10 + 0x2C s11 + 0x30 s12 + 0x34 s13 + 0x38 s14 + 0x3C s15 + 0x40 s16 + 0x44 s17 + 0x48 s18 + 0x4C s19 + 0x50 s20 + 0x54 s21 + 0x58 s22 + 0x5C s23 + 0x60 s24 + 0x64 s25 + 0x68 s26 + 0x6C s27 + 0x70 s28 + 0x74 s29 + 0x78 s30 + 0x7C s31 + 0x80 fpscr + 0x84 r4 + 0x88 r5 + 0x8C r6 + 0x90 r7 + 0x94 r8 + 0x98 r9 + 0x9C r10 (sl) + 0xA0 r11 + 0xA4 r0 (Hardware stack starts here!!) + 0xA8 r1 + 0xAC r2 + 0xB0 r3 + 0xB4 r12 + 0xB8 lr + 0xBC pc + 0xC0 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX_Library.Uv2 +project to debugging and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M7 vectors start at the label __tx_vectors. The application may modify +the vector area according to its needs. + + +6.2 Managed Interrupts + +ISRs for Cortex-M can be written completely in C (or assembly language) without any +calls to _tx_thread_context_save or _tx_thread_context_restore. These ISRs are allowed +access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + EXPORT your_assembly_isr +your_assembly_isr + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. FPU Support + +ThreadX for Cortex-M7 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-M7 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m7/ac5/src/tx_thread_context_restore.s b/ports/cortex_m7/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..b58508d3 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr + ENDIF +; + POP {lr} + BX lr +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_context_save.s b/ports/cortex_m7/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..5e789200 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_context_save.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {r0, lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover ISR lr + ENDIF +; +; /* Return to interrupt processing. */ +; + BX lr ; Return to interrupt processing caller +;} + ALIGN + LTORG + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..17e4a59a --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,85 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..894f969a --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..364f5414 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,82 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m7/ac5/src/tx_thread_schedule.s b/ports/cortex_m7/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..34bc8cd0 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_schedule.s @@ -0,0 +1,298 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; + IF {TARGET_FPU_VFP} = {TRUE} + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register + ENDIF +; +; /* Enable the interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context switching PendSV handler. */ +; + EXPORT __tx_PendSVHandler + EXPORT PendSV_Handler +__tx_PendSVHandler +PendSV_Handler +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts + ENDIF + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save + ENDIF + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 + ENDIF +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR + IF {TARGET_FPU_VFP} = {TRUE} + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore + ENDIF + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! + IF :DEF:TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed + ENDIF + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_fpu_enable +tx_thread_fpu_enable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT tx_thread_fpu_disable +tx_thread_fpu_disable +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + EXPORT _tx_vfp_access +_tx_vfp_access + VMOV.F32 s0, s0 ; Simply access the VFP + BX lr ; Return to caller + + + ENDIF + + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/ac5/src/tx_thread_stack_build.s b/ports/cortex_m7/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..d02c3df3 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,143 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M7 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m7/ac5/src/tx_thread_system_return.s b/ports/cortex_m7/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..82daa084 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_thread_system_return.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m7/ac5/src/tx_timer_interrupt.s b/ports/cortex_m7/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..661e01e6 --- /dev/null +++ b/ports/cortex_m7/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,271 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process + IMPORT _tx_thread_preempt_disable + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M7/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for +; +; } +; +__tx_timer_nothing_expired + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + ALIGN + LTORG + END + diff --git a/ports/cortex_m7/gnu/CMakeLists.txt b/ports/cortex_m7/gnu/CMakeLists.txt index a361adf0..6a8d5852 100644 --- a/ports/cortex_m7/gnu/CMakeLists.txt +++ b/ports/cortex_m7/gnu/CMakeLists.txt @@ -8,7 +8,6 @@ target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_stack_build.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_thread_system_return.S ${CMAKE_CURRENT_LIST_DIR}/src/tx_timer_interrupt.S - # {{END_TARGET_SOURCES}} ) diff --git a/ports/cortex_m7/gnu/example_build/build_threadx.bat b/ports/cortex_m7/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..f0c995e7 --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/build_threadx.bat @@ -0,0 +1,229 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_control.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_m7/gnu/example_build/build_threadx_sample.bat b/ports/cortex_m7/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..0e58e963 --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,7 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb tx_simulator_startup.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb cortexm7_crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-m7 -mthumb -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-m7 -ereset_handler -T sample_threadx.ld tx_simulator_startup.o cortexm7_crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a -o sample_threadx.out -M > sample_threadx.map + + diff --git a/ports/cortex_m7/gnu/example_build/cortexm7_crt0.s b/ports/cortex_m7/gnu/example_build/cortexm7_crt0.s new file mode 100644 index 00000000..d4cb1636 --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/cortexm7_crt0.s @@ -0,0 +1,127 @@ + .global _start + .extern main + + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + + +_start: + CPSID i + ldr r1, =__stack_end__ + mov sp, r1 + + + /* Copy initialised sections into RAM if required. */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl crt0_memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl crt0_memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl crt0_memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl crt0_memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl crt0_memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl crt0_memory_copy + + + /* Zero bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl crt0_memory_set + + + /* Setup heap - not recommended for Threadx but here for compatibility reasons */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + + /* constructors in case of using C++ */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +crt0_ctor_loop: + cmp r0, r1 + beq crt0_ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b crt0_ctor_loop +crt0_ctor_end: + + + /* Setup call frame for main() */ + mov r0, #0 + mov lr, r0 + mov r12, sp + + +start: + /* Jump to main() */ + mov r0, #0 + mov r1, #0 + ldr r2, =main + blx r2 + /* when main returns, loop forever. */ +crt0_exit_loop: + b crt0_exit_loop + + + + /* Startup helper functions. */ + + +crt0_memory_copy: + cmp r0, r1 + beq memory_copy_done + sub r2, r2, r1 + beq memory_copy_done +memory_copy_loop: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + sub r2, r2, #1 + bne memory_copy_loop +memory_copy_done: + bx lr + + +crt0_memory_set: + cmp r0, r1 + beq memory_set_done + strb r2, [r0] + add r0, r0, #1 + b crt0_memory_set +memory_set_done: + bx lr + + + /* Setup attibutes of stack and heap sections so they don't take up room in the elf file */ + .section .stack, "wa", %nobits + .section .stack_process, "wa", %nobits + .section .heap, "wa", %nobits + \ No newline at end of file diff --git a/ports/cortex_m7/gnu/example_build/libc.a b/ports/cortex_m7/gnu/example_build/libc.a new file mode 100644 index 00000000..6c1567d1 Binary files /dev/null and b/ports/cortex_m7/gnu/example_build/libc.a differ diff --git a/ports/cortex_m7/gnu/example_build/sample_threadx.c b/ports/cortex_m7/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..597f373c --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/sample_threadx.c @@ -0,0 +1,370 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; +UCHAR memory_area[DEMO_BYTE_POOL_SIZE]; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m7/gnu/example_build/sample_threadx.ld b/ports/cortex_m7/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..28f203fd --- /dev/null +++ b/ports/cortex_m7/gnu/example_build/sample_threadx.ld @@ -0,0 +1,206 @@ +MEMORY +{ + UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 + CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 + AHB_Peripherals (wx) : ORIGIN = 0x50000000, LENGTH = 0x00200000 + APB1_Peripherals (wx) : ORIGIN = 0x40080000, LENGTH = 0x00080000 + APB0_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00080000 + GPIO (wx) : ORIGIN = 0x2009c000, LENGTH = 0x00004000 + AHBSRAM1 (wx) : ORIGIN = 0x20080000, LENGTH = 0x00004000 + AHBSRAM0 (wx) : ORIGIN = 0x2007c000, LENGTH = 0x00004000 + RAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00008000 + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00080000 +} + + +SECTIONS +{ + __CM3_System_Control_Space_segment_start__ = 0xe000e000; + __CM3_System_Control_Space_segment_end__ = 0xe000f000; + __AHB_Peripherals_segment_start__ = 0x50000000; + __AHB_Peripherals_segment_end__ = 0x50200000; + __APB1_Peripherals_segment_start__ = 0x40080000; + __APB1_Peripherals_segment_end__ = 0x40100000; + __APB0_Peripherals_segment_start__ = 0x40000000; + __APB0_Peripherals_segment_end__ = 0x40080000; + __GPIO_segment_start__ = 0x2009c000; + __GPIO_segment_end__ = 0x200a0000; + __AHBSRAM1_segment_start__ = 0x20080000; + __AHBSRAM1_segment_end__ = 0x20084000; + __AHBSRAM0_segment_start__ = 0x2007c000; + __AHBSRAM0_segment_end__ = 0x20080000; + __RAM_segment_start__ = 0x10000000; + __RAM_segment_end__ = 0x10008000; + __FLASH_segment_start__ = 0x00000000; + __FLASH_segment_end__ = 0x00080000; + + __STACKSIZE__ = 1024; + __STACKSIZE_PROCESS__ = 0; + __STACKSIZE_IRQ__ = 0; + __STACKSIZE_FIQ__ = 0; + __STACKSIZE_SVC__ = 0; + __STACKSIZE_ABT__ = 0; + __STACKSIZE_UND__ = 0; + __HEAPSIZE__ = 128; + + __vectors_load_start__ = __FLASH_segment_start__; + .vectors __FLASH_segment_start__ : AT(__FLASH_segment_start__) + { + __vectors_start__ = .; + *(.vectors .vectors.*) + } + __vectors_end__ = __vectors_start__ + SIZEOF(.vectors); + + . = ASSERT(__vectors_end__ >= __FLASH_segment_start__ && __vectors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .vectors is too large to fit in FLASH memory segment"); + + __init_load_start__ = ALIGN(__vectors_end__ , 4); + .init ALIGN(__vectors_end__ , 4) : AT(ALIGN(__vectors_end__ , 4)) + { + __init_start__ = .; + *(.init .init.*) + } + __init_end__ = __init_start__ + SIZEOF(.init); + + . = ASSERT(__init_end__ >= __FLASH_segment_start__ && __init_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .init is too large to fit in FLASH memory segment"); + + __text_load_start__ = ALIGN(__init_end__ , 4); + .text ALIGN(__init_end__ , 4) : AT(ALIGN(__init_end__ , 4)) + { + __text_start__ = .; + *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table) + } + __text_end__ = __text_start__ + SIZEOF(.text); + + . = ASSERT(__text_end__ >= __FLASH_segment_start__ && __text_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .text is too large to fit in FLASH memory segment"); + + __dtors_load_start__ = ALIGN(__text_end__ , 4); + .dtors ALIGN(__text_end__ , 4) : AT(ALIGN(__text_end__ , 4)) + { + __dtors_start__ = .; + KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) + } + __dtors_end__ = __dtors_start__ + SIZEOF(.dtors); + + . = ASSERT(__dtors_end__ >= __FLASH_segment_start__ && __dtors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .dtors is too large to fit in FLASH memory segment"); + + __ctors_load_start__ = ALIGN(__dtors_end__ , 4); + .ctors ALIGN(__dtors_end__ , 4) : AT(ALIGN(__dtors_end__ , 4)) + { + __ctors_start__ = .; + KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) + } + __ctors_end__ = __ctors_start__ + SIZEOF(.ctors); + + . = ASSERT(__ctors_end__ >= __FLASH_segment_start__ && __ctors_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .ctors is too large to fit in FLASH memory segment"); + + __rodata_load_start__ = ALIGN(__ctors_end__ , 4); + .rodata ALIGN(__ctors_end__ , 4) : AT(ALIGN(__ctors_end__ , 4)) + { + __rodata_start__ = .; + *(.rodata .rodata.* .gnu.linkonce.r.*) + } + __rodata_end__ = __rodata_start__ + SIZEOF(.rodata); + + . = ASSERT(__rodata_end__ >= __FLASH_segment_start__ && __rodata_end__ <= (__FLASH_segment_start__ + 0x00080000) , "error: .rodata is too large to fit in FLASH memory segment"); + + __fast_load_start__ = ALIGN(__rodata_end__ , 4); + .fast ALIGN(__RAM_segment_start__ , 4) : AT(ALIGN(__rodata_end__ , 4)) + { + __fast_start__ = .; + *(.fast .fast.*) + } + __fast_end__ = __fast_start__ + SIZEOF(.fast); + + __fast_load_end__ = __fast_load_start__ + SIZEOF(.fast); + + . = ASSERT((__fast_load_start__ + SIZEOF(.fast)) >= __FLASH_segment_start__ && (__fast_load_start__ + SIZEOF(.fast)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .fast is too large to fit in FLASH memory segment"); + + .fast_run ALIGN(__RAM_segment_start__ , 4) (NOLOAD) : + { + __fast_run_start__ = .; + . = MAX(__fast_run_start__ + SIZEOF(.fast), .); + } + __fast_run_end__ = __fast_run_start__ + SIZEOF(.fast_run); + + . = ASSERT(__fast_run_end__ >= __RAM_segment_start__ && __fast_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .fast_run is too large to fit in RAM memory segment"); + + __data_load_start__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4); + .data ALIGN(__fast_run_end__ , 4) : AT(ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4)) + { + __data_start__ = .; + *(.data .data.* .gnu.linkonce.d.*) + } + __data_end__ = __data_start__ + SIZEOF(.data); + + __data_load_end__ = __data_load_start__ + SIZEOF(.data); + + __FLASH_segment_used_end__ = ALIGN(__fast_load_start__ + SIZEOF(.fast) , 4) + SIZEOF(.data); + + . = ASSERT((__data_load_start__ + SIZEOF(.data)) >= __FLASH_segment_start__ && (__data_load_start__ + SIZEOF(.data)) <= (__FLASH_segment_start__ + 0x00080000) , "error: .data is too large to fit in FLASH memory segment"); + + .data_run ALIGN(__fast_run_end__ , 4) (NOLOAD) : + { + __data_run_start__ = .; + . = MAX(__data_run_start__ + SIZEOF(.data), .); + } + __data_run_end__ = __data_run_start__ + SIZEOF(.data_run); + + . = ASSERT(__data_run_end__ >= __RAM_segment_start__ && __data_run_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .data_run is too large to fit in RAM memory segment"); + + __bss_load_start__ = ALIGN(__data_run_end__ , 4); + .bss ALIGN(__data_run_end__ , 4) (NOLOAD) : AT(ALIGN(__data_run_end__ , 4)) + { + __bss_start__ = .; + *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) + } + __bss_end__ = __bss_start__ + SIZEOF(.bss); + + . = ASSERT(__bss_end__ >= __RAM_segment_start__ && __bss_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .bss is too large to fit in RAM memory segment"); + + __non_init_load_start__ = ALIGN(__bss_end__ , 4); + .non_init ALIGN(__bss_end__ , 4) (NOLOAD) : AT(ALIGN(__bss_end__ , 4)) + { + __non_init_start__ = .; + *(.non_init .non_init.*) + } + __non_init_end__ = __non_init_start__ + SIZEOF(.non_init); + + . = ASSERT(__non_init_end__ >= __RAM_segment_start__ && __non_init_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .non_init is too large to fit in RAM memory segment"); + + __heap_load_start__ = ALIGN(__non_init_end__ , 4); + .heap ALIGN(__non_init_end__ , 4) (NOLOAD) : AT(ALIGN(__non_init_end__ , 4)) + { + __heap_start__ = .; + *(.heap) + . = ALIGN(MAX(__heap_start__ + __HEAPSIZE__ , .), 4); + } + __heap_end__ = __heap_start__ + SIZEOF(.heap); + + . = ASSERT(__heap_end__ >= __RAM_segment_start__ && __heap_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .heap is too large to fit in RAM memory segment"); + + __stack_load_start__ = ALIGN(__heap_end__ , 4); + .stack ALIGN(__heap_end__ , 4) (NOLOAD) : AT(ALIGN(__heap_end__ , 4)) + { + __stack_start__ = .; + *(.stack) + . = ALIGN(MAX(__stack_start__ + __STACKSIZE__ , .), 4); + } + __stack_end__ = __stack_start__ + SIZEOF(.stack); + + . = ASSERT(__stack_end__ >= __RAM_segment_start__ && __stack_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack is too large to fit in RAM memory segment"); + + __stack_process_load_start__ = ALIGN(__stack_end__ , 4); + .stack_process ALIGN(__stack_end__ , 4) (NOLOAD) : AT(ALIGN(__stack_end__ , 4)) + { + __stack_process_start__ = .; + *(.stack_process) + . = ALIGN(MAX(__stack_process_start__ + __STACKSIZE_PROCESS__ , .), 4); + } + __stack_process_end__ = __stack_process_start__ + SIZEOF(.stack_process); + + __RAM_segment_used_end__ = ALIGN(__stack_end__ , 4) + SIZEOF(.stack_process); + + . = ASSERT(__stack_process_end__ >= __RAM_segment_start__ && __stack_process_end__ <= (__RAM_segment_start__ + 0x00008000) , "error: .stack_process is too large to fit in RAM memory segment"); + +} + diff --git a/ports/cortex_m7/gnu/src/tx_initialize_low_level_sample.S b/ports/cortex_m7/gnu/example_build/tx_initialize_low_level.S old mode 100755 new mode 100644 similarity index 95% rename from ports/cortex_m7/gnu/src/tx_initialize_low_level_sample.S rename to ports/cortex_m7/gnu/example_build/tx_initialize_low_level.S index 1957867c..7b0e2100 --- a/ports/cortex_m7/gnu/src/tx_initialize_low_level_sample.S +++ b/ports/cortex_m7/gnu/example_build/tx_initialize_low_level.S @@ -59,7 +59,7 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* FUNCTION RELEASE */ @/* */ @/* _tx_initialize_low_level Cortex-M7/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -93,6 +93,9 @@ SYSTICK_CYCLES = ((SYSTEM_CLOCK / 100) -1) @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), fixed */ +@/* GNU assembly comment, */ +@/* resulting in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_initialize_low_level(VOID) @@ -191,14 +194,14 @@ __tx_IntHandler: @ { PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif @ /* Do interrupt handler work here */ @ /* BL .... */ #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR @@ -216,11 +219,11 @@ SysTick_Handler: @ PUSH {r0, lr} #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_enter ; Call the ISR enter function + BL _tx_execution_isr_enter @ Call the ISR enter function #endif BL _tx_timer_interrupt #ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY - BL _tx_execution_isr_exit ; Call the ISR exit function + BL _tx_execution_isr_exit @ Call the ISR exit function #endif POP {r0, lr} BX LR diff --git a/ports/cortex_m7/gnu/src/tx_vector_table_sample.S b/ports/cortex_m7/gnu/example_build/tx_simulator_startup.s similarity index 100% rename from ports/cortex_m7/gnu/src/tx_vector_table_sample.S rename to ports/cortex_m7/gnu/example_build/tx_simulator_startup.s diff --git a/ports/cortex_m7/gnu/readme_threadx.txt b/ports/cortex_m7/gnu/readme_threadx.txt new file mode 100644 index 00000000..287d3481 --- /dev/null +++ b/ports/cortex_m7/gnu/readme_threadx.txt @@ -0,0 +1,151 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M7 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +gnu (GNU) compiler. At this point you may run the build_threadx.bat batch file. +This will build the ThreadX run-time environment in the "example_build" +directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System for Cortex-M7 + +The ThreadX demonstration is designed to execute on Cortex-M7 evaluation boards +or on a dedicated simulator. + +Building the demonstration is easy, simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a binary +file that can be downloaded and executed on the a simulator, or downloaded to a board. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M7 using gnu tools uses the standard GNU +Cortex-M7 reset sequence. From the reset vector the C runtime will be initialized. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M7 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + + + Stack Offset Stack Contents + + 0x00 r4 + 0x04 r5 + 0x08 r6 + 0x0C r7 + 0x10 r8 + 0x14 r9 + 0x18 r10 + 0x1C r11 + 0x20 r0 (Hardware stack starts here!!) + 0x24 r1 + 0x28 r2 + 0x2C r3 + 0x30 r12 + 0x34 lr + 0x38 pc + 0x3C xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler optimizations. +This makes it easy to debug because you can trace or set breakpoints inside of +ThreadX itself. Of course, this costs some performance. To make it run faster, +you can change the build_threadx.bat file to remove the -g option and enable +all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-M7 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +6.1 Vector Area + +The Cortex-M7 vectors start at the label __tx_vectors or similar. The application may modify +the vector area according to its needs. There is code in tx_initialize_low_level() that will +configure the vector base register. + + +6.2 Managed Interrupts + +A ThreadX managed interrupt is defined below. By following these conventions, the +application ISR is then allowed access to various ThreadX services from the ISR. +Here is the standard template for managed ISRs in ThreadX: + + + .global __tx_IntHandler + .thumb_func +__tx_IntHandler: +; VOID InterruptHandler (VOID) +; { + PUSH {r0, lr} + +; /* Do interrupt handler work here */ +; /* BL */ + + POP {r0, lr} + BX lr +; } + + +Note: the Cortex-M7 requires exception handlers to be thumb labels, this implies bit 0 set. +To accomplish this, the declaration of the label has to be preceded by the assembler directive +.thumb_func to instruct the linker to create thumb labels. The label __tx_IntHandler needs to +be inserted in the correct location in the interrupt vector table. This table is typically +located in either your runtime startup file or in the tx_initialize_low_level.S file. + + +7. FPU Support + +ThreadX for Cortex-M7 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +05/19/2020 Initial ThreadX 6.0 version for Cortex-M7 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m7/gnu/src/tx_thread_stack_build.S b/ports/cortex_m7/gnu/src/tx_thread_stack_build.S index 19417731..8c4a6b7d 100755 --- a/ports/cortex_m7/gnu/src/tx_thread_stack_build.S +++ b/ports/cortex_m7/gnu/src/tx_thread_stack_build.S @@ -38,7 +38,7 @@ @/* FUNCTION RELEASE */ @/* */ @/* _tx_thread_stack_build Cortex-M7/GNU */ -@/* 6.0 */ +@/* 6.0.1 */ @/* AUTHOR */ @/* */ @/* William E. Lamie, Microsoft Corporation */ @@ -71,6 +71,11 @@ @/* DATE NAME DESCRIPTION */ @/* */ @/* 05-19-2020 William E. Lamie Initial Version 6.0 */ +@/* 06-30-2020 William E. Lamie Modified Comment(s), setting */ +@/* R10 to top of stack is not */ +@/* needed. Removed references */ +@/* to stack frame, resulting */ +@/* in version 6.0.1 */ @/* */ @/**************************************************************************/ @VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) @@ -91,7 +96,7 @@ _tx_thread_stack_build: @ r7 Initial value for r7 @ r8 Initial value for r8 @ r9 Initial value for r9 -@ r10 (sl) Initial value for r10 (sl) +@ r10 Initial value for r10 @ r11 Initial value for r11 @ r0 Initial value for r0 (Hardware stack starts here!!) @ r1 Initial value for r1 @@ -119,9 +124,7 @@ _tx_thread_stack_build: STR r3, [r2, #16] @ Store initial r7 STR r3, [r2, #20] @ Store initial r8 STR r3, [r2, #24] @ Store initial r9 - LDR r3, [r0, #12] @ Pickup stack starting address - STR r3, [r2, #28] @ Store initial r10 (sl) - MOV r3, #0 @ Build initial register value + STR r3, [r2, #28] @ Store initial r10 STR r3, [r2, #32] @ Store initial r11 @ @ /* Hardware stack follows. */ diff --git a/ports/cortex_m7/iar/example_build/azure_rtos.eww b/ports/cortex_m7/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_m7/iar/example_build/cstartup_M.s b/ports/cortex_m7/iar/example_build/cstartup_M.s new file mode 100644 index 00000000..75d9369b --- /dev/null +++ b/ports/cortex_m7/iar/example_build/cstartup_M.s @@ -0,0 +1,73 @@ + EXTERN __iar_program_start + PUBLIC __vector_table + + SECTION .text:CODE:REORDER(1) + + ;; Keep vector table even if it's not referenced + REQUIRE __vector_table + + THUMB + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec:CODE:NOROOT(2) + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD __Reset_Vector + + DCD NMI_Handler + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + + PUBWEAK NMI_Handler + PUBWEAK HardFault_Handler + PUBWEAK MemManage_Handler + PUBWEAK BusFault_Handler + PUBWEAK UsageFault_Handler + PUBWEAK SVC_Handler + PUBWEAK DebugMon_Handler + PUBWEAK PendSV_Handler + PUBWEAK SysTick_Handler + + SECTION .text:CODE:REORDER:NOROOT(1) + THUMB +__Reset_Vector: + CPSID i ; Disable interrupts + B __iar_program_start + + +NMI_Handler +HardFault_Handler +MemManage_Handler +BusFault_Handler +UsageFault_Handler +SVC_Handler +DebugMon_Handler +PendSV_Handler +SysTick_Handler +Default_Handler +__default_handler + CALL_GRAPH_ROOT __default_handler, "interrupt" + NOCALL __default_handler + B __default_handler + + END diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.c b/ports/cortex_m7/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..9a626828 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.c @@ -0,0 +1,381 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + +/* Optimize by disabling basic ThreadX error checking. */ +#define TX_DISABLE_ERROR_CHECKING + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define memory pool. */ + +UCHAR memory_pool[DEMO_BYTE_POOL_SIZE]; + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Please refer to Chapter 6 of the ThreadX User Guide for a complete + description of this demonstration. */ + + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_pool, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.dep b/ports/cortex_m7/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..3e6a20f0 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.dep @@ -0,0 +1,113 @@ + + + 4 + 774047933 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\cstartup_M.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Exe\tx.a + $TOOLKIT_DIR$\lib\m7M_tls.a + $TOOLKIT_DIR$\lib\dl7M_tln.a + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\cstartup_M.s + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\..\inc\tx_port.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + [ROOT_NODE] + + + ILINK + 12 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 3 5 0 17 10 11 1 18 19 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 10 + + + + + $PROJ_DIR$\cstartup_M.s + + + AARM + 5 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 0 + + + __cstat + 28 + + + BICOMP + 23 + + + + + ICCARM + 29 26 24 6 14 4 20 7 8 2 9 16 15 27 31 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.ewd b/ports/cortex_m7/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..6f975a27 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.ewp b/ports/cortex_m7/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..8c183b8f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2127 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.ewt b/ports/cortex_m7/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..24445b46 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2788 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + $PROJ_DIR$\cstartup_M.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + diff --git a/ports/cortex_m7/iar/example_build/sample_threadx.icf b/ports/cortex_m7/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..246d387e --- /dev/null +++ b/ports/cortex_m7/iar/example_build/sample_threadx.icf @@ -0,0 +1,42 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0007FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define symbol FlashConfig_start__= 0x00000400; +define symbol FlashConfig_end__ = 0x0000040f; + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to (FlashConfig_start__ - 1)] | [from (FlashConfig_end__+1) to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +define region FlashConfig_region = mem:[from FlashConfig_start__ to FlashConfig_end__]; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; + +place in FlashConfig_region + {section FlashConfig}; + +place in RAM_region { last section FREE_MEM}; + diff --git a/ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..85a9832f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 286 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 020000000A00259600000100000010860000090000000C81000002000000048600000100000000810000010000000E81000001000000118600000900000046810000020000000D81000001000000E880000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000062040000000A000065050000 + 000000004B040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000063040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000006601000047040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF66010000320000006A010000470400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000047040000000A00004B040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000062040000000A000065050000000000004B040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..f5c060f6 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..9fc15b26 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..c0ab94e4 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M7" + +"--fpu=VFPv5_SP" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..db2ac682 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_m7\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.crun b/ports/cortex_m7/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..40bc8d5f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1356 @@ + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 149 + 150 + 100 + 100 + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1B0000000A00259600000100000010860000090000000C81000002000000048600000100000000810000010000000E81000001000000118600000900000046810000020000000D81000001000000E880000001000000 + + + 1100FFFFFFFF8386000058860000008D0000008800000188000002880000038800000488000005880000439200001E920000289200002992000024960000259600001F960000 + 180057860000180000005992000023000000239200000000000007860000270000001D9200001100000004860000240000009A860000160000000084000075000000259200001900000044920000210000001A860000310000001F9200001E0000008E8600003A00000006860000260000002D920000200000006986000037000000558600000600000023960000860000000E86000017000000A18600003B000000C386000003000000C08600000A00000005860000250000002C9200001F000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 4294967295 + 000000004900000006010000CB020000 + 000000004C000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34062 + 020800004C00000024090000FC000000 + 00000000B2040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34064 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34066 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34100 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34112 + 020800004C00000024090000FC000000 + 04000000B6040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 020800004C000000820A0000DC000000 + 00000000000000008002000090000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34060 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34063 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34070 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34076 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 020800004C000000240900000C010000 + 040000000C020000A00600009A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34091 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34094 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34096 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34102 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 020800004C00000008090000AC010000 + 040000004A0000000201000078010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 020800004C00000008090000AC010000 + 0000000060000000060100009A040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34104 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34107 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34108 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 020800004C000000B00900000C010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 020800004C00000024090000FC000000 + 0A01000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34115 + 020800004C00000024090000FC000000 + 0A01000050010000A406000000020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34116 + 020800004C00000024090000FC000000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 020800004C00000008090000AC010000 + FA0800004C000000000A00009A040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + 34118 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 020800004C00000008090000AC010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0000000080000000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000478500000000000000000000000000000000000001000000478500000100000047850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000001000000FFFFFFFFFFFFFFFFF60800004C000000FA0800009A040000010000000200001004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000080000000000000FFFFFFFFFFFFFFFF0A0100004C010000A406000050010000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF0A01000000020000A406000004020000000000000100000004000000010000000000000000000000428500000000000000000000000000000000000001000000428500000100000042850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003C85000000000000000000000000000000000000010000003C850000010000003C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003B85000000000000000000000000000000000000010000003B850000010000003B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A0100009A040000010000000200001004000000010000000000000000000000FFFFFFFF0100000049850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CB020000000000004C000000060100009A040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000004985000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF4985000001000000FFFFFFFF49850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000368500000000000000000000000000000000000001000000368500000100000036850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002F85000000000000000000000000000000000000010000002F850000010000002F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002E85000000000000000000000000000000000000010000002E850000010000002E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000080000000000000FFFFFFFFFFFFFFFF00000000F0010000A4060000F4010000000000000100000004000000010000000000000000000000FFFFFFFF040000001A8500001B8500001C8500001D85000001800080000000000000000000000B020000A4060000CB02000000000000F4010000A4060000B4020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001A85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001B85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001C85000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001D85000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1A85000001000000FFFFFFFF1A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000188500000000000000000000000000000000000001000000188500000100000018850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000178500000000000000000000000000000000000001000000178500000100000017850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000168500000000000000000000000000000000000001000000168500000100000016850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000158500000000000000000000000000000000000001000000158500000100000015850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF000000009A040000000A00009E040000010000000100001004000000010000000000000000000000FFFFFFFF07000000058500000E85000010850000118500001285000034850000408500000180008000000100000000000000CF020000A40600007F030000000000009E040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000001085000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000001185000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000001285000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000003485000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000004085000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000048500000000000000000000000000000000000001000000048500000100000004850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004B85000000000000000000000000000000000000010000004B850000010000004B850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + E40300001A0000002904000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000062000000FFFEFF000000000000000000000000000100000001000000018001E100000000000063000000FFFEFF000000000000000000000000000100000001000000018003E100000000000065000000FFFEFF0000000000000000000000000001000000010000000180008100000000000046000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000000068000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018022E100000000040069000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006C000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE10000000004006F000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040070000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF00960000000000000000000180218100000000040059000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006B000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006D000000FFFEFF000000000000000000000000000100000001000000018029E10000000000006E000000FFFEFF0000000000000000000000000001000000010000000180028100000000000048000000FFFEFF000000000000000000000000000100000001000000018029810000000000005D000000FFFEFF000000000000000000000000000100000001000000018027810000000000005B000000FFFEFF000000000000000000000000000100000001000000018028810000000000005C000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040055000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040056000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004C000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004D000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000061000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000057000000FFFEFF0000000000000000000000000001000000010000000180208100000000000058000000FFFEFF000000000000000000000000000100000001000000018046810000000002005F000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 32767 + 0 + + + 1 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34123 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34126 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34122 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..7ae81233 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,99 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 4108083456 + + + 0 + + + _ 0 + _ 0 + + + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "SysTick 1 0x3C" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..b5f366cc --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,13 @@ +"--endian=little" + +"--cpu=Cortex-M7" + +"--fpu=None" + +"--semihosting" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.crun b/ports/cortex_m7/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.dbgdt b/ports/cortex_m7/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..73e71f6e --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_m7/iar/example_build/settings/tx.dnx b/ports/cortex_m7/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..1872e83f --- /dev/null +++ b/ports/cortex_m7/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_m7/iar/example_build/tx.dep b/ports/cortex_m7/iar/example_build/tx.dep new file mode 100644 index 00000000..30b4e270 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.dep @@ -0,0 +1,8055 @@ + + + 4 + 851124999 + + Debug + + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_misra.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 518 + + + BICOMP + 18 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 3 + + + BICOMP + 587 419 564 3 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 535 + + + BICOMP + 52 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 3 + + + BICOMP + 531 182 237 587 525 419 564 8 3 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 434 + + + BICOMP + 338 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 3 + + + BICOMP + 593 562 210 592 8 3 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 357 + + + BICOMP + 397 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 3 + + + BICOMP + 531 182 237 587 525 419 564 8 3 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 393 + + + BICOMP + 96 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 3 + + + BICOMP + 593 562 210 592 8 3 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 405 + + + BICOMP + 559 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 592 3 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 137 + + + BICOMP + 39 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 592 3 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 327 + + + BICOMP + 570 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 3 + + + BICOMP + 587 419 564 3 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 396 + + + BICOMP + 328 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 592 3 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 431 + + + BICOMP + 24 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 3 + + + BICOMP + 587 419 564 3 525 210 531 8 237 182 541 540 562 593 592 + + + + + [ROOT_NODE] + + + IARCHIVE + 120 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 357 535 393 327 434 405 137 396 431 518 495 464 500 432 382 44 569 76 370 597 58 86 485 356 548 84 378 533 440 347 329 74 68 538 520 437 411 473 355 54 41 70 416 77 542 470 517 127 504 359 12 376 132 493 108 374 387 420 429 334 578 523 563 418 65 352 461 122 497 363 516 63 488 341 505 515 574 408 130 94 554 558 468 584 543 19 88 591 36 560 351 38 326 514 487 344 557 112 354 107 524 596 428 451 15 575 519 335 32 332 498 47 379 21 489 49 23 581 459 422 71 412 75 561 496 410 395 42 457 126 474 458 480 476 494 400 425 386 92 506 583 421 67 121 78 110 73 37 503 534 345 490 427 64 528 45 433 499 346 389 124 407 35 358 509 588 398 372 128 426 529 388 492 573 549 511 565 430 402 413 576 521 481 491 80 449 556 424 404 547 555 423 330 89 + + + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 397 52 96 570 338 559 39 328 24 18 69 586 17 13 111 109 445 417 545 62 331 91 486 114 117 34 353 466 60 56 448 61 48 364 589 123 472 447 20 106 522 544 371 59 333 482 539 483 550 375 100 513 115 401 475 580 469 484 598 95 444 553 460 102 40 349 99 507 81 26 479 568 392 443 537 57 455 384 595 454 14 415 579 566 90 510 43 362 391 546 577 337 113 380 453 441 66 442 373 104 582 369 29 118 477 439 343 116 336 135 25 30 599 87 82 446 403 51 350 97 590 85 409 572 79 93 438 452 105 399 50 101 390 512 471 348 134 342 55 594 406 456 526 368 133 467 16 532 98 462 339 502 394 567 450 83 33 27 552 53 103 527 46 585 551 465 501 31 125 478 414 381 119 508 377 28 340 385 136 436 435 131 571 22 463 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 432 + + + BICOMP + 13 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 156 + + + BICOMP + 156 592 210 562 593 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 437 + + + BICOMP + 123 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 139 + + + BICOMP + 564 182 237 541 525 8 139 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 76 + + + BICOMP + 417 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 564 156 541 525 8 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 473 + + + BICOMP + 447 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 44 + + + BICOMP + 109 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 564 156 541 525 8 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 58 + + + BICOMP + 331 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 156 + + + BICOMP + 156 592 210 182 562 593 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 86 + + + BICOMP + 91 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 145 + + + BICOMP + 564 237 541 525 8 145 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 485 + + + BICOMP + 486 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 145 + + + BICOMP + 182 540 562 210 8 145 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 548 + + + BICOMP + 117 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 145 + + + BICOMP + 182 541 525 145 210 564 8 237 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 347 + + + BICOMP + 56 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 145 + + + BICOMP + 541 525 145 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 569 + + + BICOMP + 445 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 564 156 541 525 8 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 74 + + + BICOMP + 61 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 139 + + + BICOMP + 562 139 593 167 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 370 + + + BICOMP + 545 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 156 + + + BICOMP + 156 592 210 562 593 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 440 + + + BICOMP + 60 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 562 145 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 68 + + + BICOMP + 48 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 167 237 231 183 181 145 139 3 156 + + + BICOMP + 562 540 183 3 210 237 145 182 8 167 231 181 139 156 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 411 + + + BICOMP + 472 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 210 139 + + + BICOMP + 541 525 139 237 564 8 210 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 533 + + + BICOMP + 466 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 562 145 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 329 + + + BICOMP + 448 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 145 + + + BICOMP + 540 562 182 210 8 145 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 520 + + + BICOMP + 589 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 + + + BICOMP + 531 167 587 525 419 564 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 495 + + + BICOMP + 69 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 156 + + + BICOMP + 562 182 593 237 592 8 156 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 464 + + + BICOMP + 586 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 156 + + + BICOMP + 562 182 593 237 592 8 156 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 500 + + + BICOMP + 17 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 156 + + + BICOMP + 541 525 210 564 8 156 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 382 + + + BICOMP + 111 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 156 + + + BICOMP + 541 525 210 564 8 156 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 597 + + + BICOMP + 62 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 156 + + + BICOMP + 562 593 237 182 592 8 156 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 84 + + + BICOMP + 34 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 145 + + + BICOMP + 182 540 562 210 8 145 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 378 + + + BICOMP + 353 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 562 145 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 356 + + + BICOMP + 114 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 145 + + + BICOMP + 541 525 145 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 538 + + + BICOMP + 364 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 592 231 167 562 593 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 504 + + + BICOMP + 550 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 429 + + + BICOMP + 598 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 181 + + + BICOMP + 587 419 564 182 525 210 531 8 181 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 563 + + + BICOMP + 460 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 418 + + + BICOMP + 102 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 517 + + + BICOMP + 539 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 181 + + + BICOMP + 562 237 182 540 8 181 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 108 + + + BICOMP + 475 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 531 181 587 525 419 564 8 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 578 + + + BICOMP + 444 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 183 + + + BICOMP + 531 182 237 587 525 419 564 8 183 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 41 + + + BICOMP + 522 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 562 139 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 12 + + + BICOMP + 100 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 182 210 8 237 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 54 + + + BICOMP + 106 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 139 + + + BICOMP + 540 562 210 8 139 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 132 + + + BICOMP + 115 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 531 181 587 525 419 564 8 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 77 + + + BICOMP + 59 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 334 + + + BICOMP + 95 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 182 587 419 564 183 525 210 531 8 237 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 387 + + + BICOMP + 469 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 182 540 562 181 210 8 237 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 65 + + + BICOMP + 40 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 183 + + + BICOMP + 593 182 562 210 592 8 183 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 355 + + + BICOMP + 20 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 182 564 8 237 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 70 + + + BICOMP + 544 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 562 139 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 416 + + + BICOMP + 371 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 562 139 540 8 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 470 + + + BICOMP + 482 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 139 + + + BICOMP + 541 525 139 210 564 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 359 + + + BICOMP + 375 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 523 + + + BICOMP + 553 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 183 + + + BICOMP + 593 182 562 210 592 8 183 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 352 + + + BICOMP + 349 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 592 183 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 493 + + + BICOMP + 401 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 531 181 587 525 419 564 8 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 127 + + + BICOMP + 483 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 181 + + + BICOMP + 587 419 564 525 210 531 8 181 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 420 + + + BICOMP + 484 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 542 + + + BICOMP + 333 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 139 + + + BICOMP + 182 564 237 541 525 8 139 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 376 + + + BICOMP + 513 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 181 + + + BICOMP + 587 419 564 525 210 531 8 181 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 374 + + + BICOMP + 580 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 181 + + + BICOMP + 540 562 181 210 8 237 182 593 592 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 451 + + + BICOMP + 441 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 231 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 412 + + + BICOMP + 599 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 112 + + + BICOMP + 577 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 428 + + + BICOMP + 453 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 210 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 107 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 519 + + + BICOMP + 373 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 335 + + + BICOMP + 104 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 332 + + + BICOMP + 369 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 21 + + + BICOMP + 439 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 489 + + + BICOMP + 343 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 15 + + + BICOMP + 66 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 47 + + + BICOMP + 118 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 459 + + + BICOMP + 135 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 75 + + + BICOMP + 87 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 49 + + + BICOMP + 116 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 354 + + + BICOMP + 337 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 237 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 557 + + + BICOMP + 546 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 581 + + + BICOMP + 336 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 561 + + + BICOMP + 82 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 496 + + + BICOMP + 446 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 410 + + + BICOMP + 403 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 32 + + + BICOMP + 582 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 524 + + + BICOMP + 113 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 237 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 575 + + + BICOMP + 442 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 596 + + + BICOMP + 380 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 231 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 23 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 422 + + + BICOMP + 25 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 71 + + + BICOMP + 30 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 498 + + + BICOMP + 29 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 379 + + + BICOMP + 477 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 231 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 63 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 341 + + + BICOMP + 568 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 167 + + + BICOMP + 525 167 587 419 564 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 574 + + + BICOMP + 537 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 182 562 593 8 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 122 + + + BICOMP + 507 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 592 183 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 130 + + + BICOMP + 455 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 + + + BICOMP + 237 182 531 8 540 525 419 564 167 587 541 562 593 592 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 554 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 515 + + + BICOMP + 443 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 182 593 210 592 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 19 + + + BICOMP + 14 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 182 592 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 558 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 497 + + + BICOMP + 81 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 88 + + + BICOMP + 415 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 564 231 210 541 525 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 461 + + + BICOMP + 99 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 592 183 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 468 + + + BICOMP + 384 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 36 + + + BICOMP + 566 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 167 + + + BICOMP + 525 167 587 419 564 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 591 + + + BICOMP + 579 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 38 + + + BICOMP + 510 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 231 + + + BICOMP + 564 231 210 541 525 8 237 182 587 419 531 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 326 + + + BICOMP + 43 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 182 562 593 8 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 514 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 487 + + + BICOMP + 362 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 344 + + + BICOMP + 391 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 94 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 584 + + + BICOMP + 595 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 543 + + + BICOMP + 454 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 182 562 593 210 592 8 237 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 560 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 351 + + + BICOMP + 90 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 592 237 562 593 8 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 363 + + + BICOMP + 26 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 183 + + + BICOMP + 587 419 564 183 525 210 531 8 237 182 541 540 562 593 592 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 488 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 505 + + + BICOMP + 392 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 408 + + + BICOMP + 57 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 562 593 210 592 8 237 182 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 516 + + + BICOMP + 479 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 183 + + + BICOMP + 593 182 562 210 592 8 183 540 587 541 564 525 419 531 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 481 + + + BICOMP + 508 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 124 + + + BICOMP + 502 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 372 + + + BICOMP + 552 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 529 + + + BICOMP + 527 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 183 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 573 + + + BICOMP + 551 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 433 + + + BICOMP + 532 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 139 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 346 + + + BICOMP + 462 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 231 237 181 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 407 + + + BICOMP + 394 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 398 + + + BICOMP + 27 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + BICOMP + 465 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 389 + + + BICOMP + 339 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 413 + + + BICOMP + 414 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 565 + + + BICOMP + 31 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 521 + + + BICOMP + 119 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 491 + + + BICOMP + 377 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 556 + + + BICOMP + 385 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 35 + + + BICOMP + 567 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 388 + + + BICOMP + 46 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 402 + + + BICOMP + 478 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 358 + + + BICOMP + 450 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 181 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 430 + + + BICOMP + 125 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 576 + + + BICOMP + 381 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 492 + + + BICOMP + 585 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 183 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 426 + + + BICOMP + 103 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 183 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 80 + + + BICOMP + 28 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 499 + + + BICOMP + 98 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 167 139 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 509 + + + BICOMP + 83 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 588 + + + BICOMP + 33 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 237 181 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 237 181 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 128 + + + BICOMP + 53 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 183 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 183 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 449 + + + BICOMP + 340 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 511 + + + BICOMP + 501 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 424 + + + BICOMP + 136 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 42 + + + BICOMP + 350 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 458 + + + BICOMP + 409 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 480 + + + BICOMP + 572 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 457 + + + BICOMP + 97 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 237 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 237 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 126 + + + BICOMP + 590 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 476 + + + BICOMP + 79 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 78 + + + BICOMP + 348 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 156 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 67 + + + BICOMP + 512 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 156 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 73 + + + BICOMP + 342 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 145 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 37 + + + BICOMP + 55 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 145 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 121 + + + BICOMP + 471 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 156 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 534 + + + BICOMP + 406 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 145 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 494 + + + BICOMP + 93 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 3 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 345 + + + BICOMP + 456 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 145 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 110 + + + BICOMP + 134 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 156 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + BICOMP + 526 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 145 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 583 + + + BICOMP + 101 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 156 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 427 + + + BICOMP + 368 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 139 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 64 + + + BICOMP + 133 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 139 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 528 + + + BICOMP + 467 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 139 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 506 + + + BICOMP + 50 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 3 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 421 + + + BICOMP + 390 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 156 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 156 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 400 + + + BICOMP + 438 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 3 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 503 + + + BICOMP + 594 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 145 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 145 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 474 + + + BICOMP + 85 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 45 + + + BICOMP + 16 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 139 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 139 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 395 + + + BICOMP + 51 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 210 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 210 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 425 + + + BICOMP + 452 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 3 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 92 + + + BICOMP + 399 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 3 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 386 + + + BICOMP + 105 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 3 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 3 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 555 + + + BICOMP + 131 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 330 + + + BICOMP + 22 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 237 231 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 423 + + + BICOMP + 571 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 89 + + + BICOMP + 463 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 547 + + + BICOMP + 435 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 167 237 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 167 237 231 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 404 + + + BICOMP + 436 + + + + + ICCARM + 8 182 587 564 562 593 72 592 525 419 540 531 541 231 + + + BICOMP + 8 182 587 564 562 593 592 536 530 525 540 531 541 231 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 63 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 23 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 554 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 560 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 107 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 488 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 94 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 514 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 74 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 678 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 558 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 130 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 591 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 332 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 498 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 487 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 354 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 524 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 36 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 667 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 38 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 344 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 19 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 15 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 575 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 32 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 47 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 112 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 451 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 335 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 351 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 408 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 543 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 596 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 428 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 519 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 584 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 515 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 574 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 88 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 326 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 557 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 468 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 516 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 429 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 461 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 334 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 418 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 122 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 363 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 578 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 523 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 65 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 505 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 563 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 497 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 341 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 667 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 352 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 77 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 411 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 665 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 470 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 517 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 41 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 542 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 538 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 347 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 329 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 437 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 473 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 520 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 68 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 667 679 671 681 664 673 678 677 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 355 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 54 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 70 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 416 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 413 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 424 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 402 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 556 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 555 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 423 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 491 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 80 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 511 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 449 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 521 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 481 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 430 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 404 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 89 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 547 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 576 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 330 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 565 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 58 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 495 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 569 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 378 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 432 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 370 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 86 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 382 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 76 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 535 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 434 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 44 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 485 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 431 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 548 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 84 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 597 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 533 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 137 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 356 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 440 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 393 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 405 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 500 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 396 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 518 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 464 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 357 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 327 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 127 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 504 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 12 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 376 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 132 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 359 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 108 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 493 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 374 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 387 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 420 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 35 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 573 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 549 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 388 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 128 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 345 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 45 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 78 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 499 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 389 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 73 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 407 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 358 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 398 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 433 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 503 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 372 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 37 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 64 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 534 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 110 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 528 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 124 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 427 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 678 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 490 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 673 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 346 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 509 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 588 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 664 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 426 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 529 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 492 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 681 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 506 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 421 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 581 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 476 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 425 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 410 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 412 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 67 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 583 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 121 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 675 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 422 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 395 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 561 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 496 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 489 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 42 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 459 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 457 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 474 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 480 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 75 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 92 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 71 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 494 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 400 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 667 679 671 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 386 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 677 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 21 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 671 679 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 379 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 671 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 458 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 126 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 665 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 49 + + + + + ICCARM + 663 611 587 564 562 593 72 592 525 419 540 531 541 736 737 679 671 + + + + + [MULTI_TOOL] + ILINK + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_m7/iar/example_build/tx.ewd b/ports/cortex_m7/iar/example_build/tx.ewd new file mode 100644 index 00000000..5bb89d18 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_m7/iar/example_build/tx.ewp b/ports/cortex_m7/iar/example_build/tx.ewp new file mode 100644 index 00000000..1bb260e3 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.ewp @@ -0,0 +1,2742 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m7/iar/example_build/tx.ewt b/ports/cortex_m7/iar/example_build/tx.ewt new file mode 100644 index 00000000..b13c96f7 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx.ewt @@ -0,0 +1,3403 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 2 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_m7/iar/example_build/tx_initialize_low_level.s b/ports/cortex_m7/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..bcf8d4b1 --- /dev/null +++ b/ports/cortex_m7/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,177 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_timer_interrupt + EXTERN __vector_table + EXTERN _tx_execution_isr_enter + EXTERN _tx_execution_isr_exit +; +; +SYSTEM_CLOCK EQU 25000000 +SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 100) -1) + + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level: +; +; /* Ensure that interrupts are disabled. */ +; + CPSID i ; Disable interrupts +; +; +; /* Set base of available memory to end of non-initialised RAM area. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory ; Build address of unused memory pointer + STR r0, [r2, #0] ; Save first free memory address +; +; /* Enable the cycle count register. */ +; + LDR r0, =0xE0001000 ; Build address of DWT register + LDR r1, [r0] ; Pickup the current value + ORR r1, r1, #1 ; Set the CYCCNTENA bit + STR r1, [r0] ; Enable the cycle count register +; +; /* Setup Vector Table Offset Register. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =__vector_table ; Pickup address of vector table + STR r1, [r0, #0xD08] ; Set vector table address +; +; /* Set system stack pointer from vector value. */ +; + LDR r0, =_tx_thread_system_stack_ptr ; Build address of system stack pointer + LDR r1, =__vector_table ; Pickup address of vector table + LDR r1, [r1] ; Pickup reset stack pointer + STR r1, [r0] ; Save system stack pointer +; +; /* Configure SysTick. */ +; + MOV r0, #0xE000E000 ; Build address of NVIC registers + LDR r1, =SYSTICK_CYCLES + STR r1, [r0, #0x14] ; Setup SysTick Reload Value + MOV r1, #0x7 ; Build SysTick Control Enable Value + STR r1, [r0, #0x10] ; Setup SysTick Control +; +; /* Configure handler priorities. */ +; + LDR r1, =0x00000000 ; Rsrv, UsgF, BusF, MemM + STR r1, [r0, #0xD18] ; Setup System Handlers 4-7 Priority Registers + + LDR r1, =0xFF000000 ; SVCl, Rsrv, Rsrv, Rsrv + STR r1, [r0, #0xD1C] ; Setup System Handlers 8-11 Priority Registers + ; Note: SVC must be lowest priority, which is 0xFF + + LDR r1, =0x40FF0000 ; SysT, PnSV, Rsrv, DbgM + STR r1, [r0, #0xD20] ; Setup System Handlers 12-15 Priority Registers + ; Note: PnSV must be lowest priority, which is 0xFF +; +; /* Return to caller. */ +; + BX lr +;} +; +; + PUBLIC SysTick_Handler + PUBLIC __tx_SysTickHandler +__tx_SysTickHandler: +SysTick_Handler: +; +; VOID SysTick_Handler (VOID) +; { +; + PUSH {r0, lr} +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_enter ; Call the ISR enter function +#endif + BL _tx_timer_interrupt +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif + POP {r0, lr} + BX LR +; } + END + diff --git a/ports/cortex_m7/iar/inc/tx_port.h b/ports/cortex_m7/iar/inc/tx_port.h new file mode 100644 index 00000000..9995e99a --- /dev/null +++ b/ports/cortex_m7/iar/inc/tx_port.h @@ -0,0 +1,499 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-M7/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX Cortex-M3 port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0xE0001004) +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (0) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif +#ifndef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +#define TX_THREAD_EXTENSION_3 +#else +#define TX_THREAD_EXTENSION_3 unsigned long long tx_thread_execution_time_total; \ + unsigned long long tx_thread_execution_time_last_start; +#endif + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + +#ifdef __ARMVFP__ + +#ifdef TX_MISRA_ENABLE + +ULONG _tx_misra_control_get(void); +void _tx_misra_control_set(ULONG value); +ULONG _tx_misra_fpccr_get(void); +void _tx_misra_vfp_touch(void); + +#endif + +/* A completed thread falls into _thread_shell_entry and we can simply deactivate the FPU via CONTROL.FPCA + in order to ensure no lazy stacking will occur. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } + +#endif + +/* A thread can be terminated by another thread, so we first check if it's self-terminating and not in an ISR. + If so, deactivate the FPU via CONTROL.FPCA. Otherwise we are in an interrupt or another thread is terminating + this one, so if the FPCCR.LSPACT bit is set, we need to save the CONTROL.FPCA state, touch the FPU to flush + the lazy FPU save, then restore the CONTROL.FPCA state. */ + +#ifndef TX_MISRA_ENABLE + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = *((ULONG *) 0xE000EF34); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + __asm volatile ("vmov.f32 s0, s0"); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = __get_CONTROL(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + __set_CONTROL(_tx_vfp_state); \ + } \ + } \ + } \ + } +#else + +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) { \ + ULONG _tx_system_state; \ + _tx_system_state = TX_THREAD_GET_SYSTEM_STATE(); \ + if ((_tx_system_state == ((ULONG) 0)) && ((thread_ptr) == _tx_thread_current_ptr)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + else \ + { \ + ULONG _tx_fpccr; \ + _tx_fpccr = _tx_misra_fpccr_get(); \ + _tx_fpccr = _tx_fpccr & ((ULONG) 0x01); \ + if (_tx_fpccr == ((ULONG) 0x01)) \ + { \ + ULONG _tx_vfp_state; \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ((ULONG) 0x4); \ + _tx_misra_vfp_touch(); \ + if (_tx_vfp_state == ((ULONG) 0)) \ + { \ + _tx_vfp_state = _tx_misra_control_get(); \ + _tx_vfp_state = _tx_vfp_state & ~((ULONG) 0x4); \ + _tx_misra_control_set(_tx_vfp_state); \ + } \ + } \ + } \ + } +#endif + +#else + +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + +#endif + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Define the get system state macro. */ + +#ifndef TX_THREAD_GET_SYSTEM_STATE +#ifndef TX_MISRA_ENABLE +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | __get_IPSR()) +#else +ULONG _tx_misra_ipsr_get(VOID); +#define TX_THREAD_GET_SYSTEM_STATE() (_tx_thread_system_state | _tx_misra_ipsr_get()) +#endif +#endif + + +/* Define the check for whether or not to call the _tx_thread_system_return function. A non-zero value + indicates that _tx_thread_system_return should not be called. This overrides the definition in tx_thread.h + for Cortex-M since so we don't waste time checking the _tx_thread_system_state variable that is always + zero after initialization for Cortex-M ports. */ + +#ifndef TX_THREAD_SYSTEM_RETURN_CHECK +#define TX_THREAD_SYSTEM_RETURN_CHECK(c) (c) = ((ULONG) _tx_thread_preempt_disable); +#endif + + +/* Define the macro to ensure _tx_thread_preempt_disable is set early in initialization in order to + prevent early scheduling on Cortex-M parts. */ + +#define TX_PORT_SPECIFIC_POST_INITIALIZATION _tx_thread_preempt_disable++; + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) (b) = (UINT)__CLZ(__RBIT((m))); + +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +/* The embedded assembler blocks are design so as to be inlinable by the + armlink linker inlining. This requires them to consist of either a + single 32-bit instruction, or either one or two 16-bit instructions + followed by a "BX lr". Note that to reduce the critical region size, the + 16-bit "CPSID i" instruction is preceeded by a 16-bit NOP */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(VOID); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA register UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA __istate_t interrupt_save; +#define TX_DISABLE {interrupt_save = __get_interrupt_state();__disable_interrupt();}; +#define TX_RESTORE {__set_interrupt_state(interrupt_save);}; + +#define _tx_thread_system_return _tx_thread_system_return_inline + +static void _tx_thread_system_return_inline(void) +{ +__istate_t interrupt_save; + + /* Set PendSV to invoke ThreadX scheduler. */ + *((ULONG *) 0xE000ED04) = ((ULONG) 0x10000000); + if (__get_IPSR() == 0) + { + interrupt_save = __get_interrupt_state(); + __enable_interrupt(); + __set_interrupt_state(interrupt_save); + } +} + +#endif + + +/* Define FPU extension for the Cortex-M7. Each is assumed to be called in the context of the executing + thread. These are no longer needed, but are preserved for backward compatibility only. */ + +void tx_thread_fpu_enable(void); +void tx_thread_fpu_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-M7/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_m7/iar/readme_threadx.txt b/ports/cortex_m7/iar/readme_threadx.txt new file mode 100644 index 00000000..42c8d901 --- /dev/null +++ b/ports/cortex_m7/iar/readme_threadx.txt @@ -0,0 +1,216 @@ + Microsoft's Azure RTOS ThreadX for Cortex-M7 + + Using the IAR Tools + + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR debugger under +simulation. + +Building the demonstration is easy; simply open the threadx.www workspace file, +make the sample_threadx.ewp project the "active project" in the IAR Embedded +Workbench, and select the "Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary ELF file that can be downloaded and executed on the IAR Windows-based +Cortex-M7 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-M7 using IAR tools is at label +__iar_program_start. This is defined within the IAR compiler's startup code. +In addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup_M.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have the same stack frame in the Cortex-M7 version of +ThreadX. The top of the suspended thread's stack is pointed to by +tx_thread_stack_ptr in the associated thread control block TX_THREAD. + +Non-FPU Stack Frame: + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 r4 + 0x08 r5 + 0x0C r6 + 0x10 r7 + 0x14 r8 + 0x18 r9 + 0x1C r10 (sl) + 0x20 r11 + 0x24 r0 (Hardware stack starts here!!) + 0x28 r1 + 0x2C r2 + 0x30 r3 + 0x34 r12 + 0x38 lr + 0x3C pc + 0x40 xPSR + +FPU Stack Frame (only interrupted thread with FPU enabled): + + Stack Offset Stack Contents + + 0x00 LR Interrupted LR (LR at time of PENDSV) + 0x04 s0 + 0x08 s1 + 0x0C s2 + 0x10 s3 + 0x14 s4 + 0x18 s5 + 0x1C s6 + 0x20 s7 + 0x24 s8 + 0x28 s9 + 0x2C s10 + 0x30 s11 + 0x34 s12 + 0x38 s13 + 0x3C s14 + 0x40 s15 + 0x44 s16 + 0x48 s17 + 0x4C s18 + 0x50 s19 + 0x54 s20 + 0x58 s21 + 0x5C s22 + 0x60 s23 + 0x64 s24 + 0x68 s25 + 0x6C s26 + 0x70 s27 + 0x74 s28 + 0x78 s29 + 0x7C s30 + 0x80 s31 + 0x84 fpscr + 0x88 r4 + 0x8C r5 + 0x90 r6 + 0x94 r7 + 0x98 r8 + 0x9C r9 + 0xA0 r10 (sl) + 0xA4 r11 + 0xA8 r0 (Hardware stack starts here!!) + 0xAC r1 + 0xB0 r2 + 0xB4 r3 + 0xB8 r12 + 0xBC lr + 0xC0 pc + 0xC4 xPSR + + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +6. Interrupt Handling + +The Cortex-M7 vectors start at the label __vector_table and is defined in cstartup_M.s. +The application may modify the vector area according to its needs. + + +6.1 Managed Interrupts + +ISRs for Cortex-M using the IAR tools can be written completely in C (or assembly +language) without any calls to _tx_thread_context_save or _tx_thread_context_restore. +These ISRs are allowed access to the ThreadX API that is available to ISRs. + +ISRs written in C will take the form (where "your_C_isr" is an entry in the vector table): + +void your_C_isr(void) +{ + + /* ISR processing goes here, including any needed function calls. */ +} + +ISRs written in assembly language will take the form: + + PUBLIC your_assembly_isr +your_assembly_isr: + + PUSH {r0, lr} + + ; ISR processing goes here, including any needed function calls. + + POP {r0, lr} + BX lr + + +7. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + +The project options "General Options -> Library Configuration" should also have the +"Enable thread support in library" box selected. + + +8. VFP Support + +ThreadX for Cortex-M7 supports automatic ("lazy") VFP support, which means that applications threads +can simply use the VFP and ThreadX automatically maintains the VFP registers as part of the thread +context - no additional setup by the application. + + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-M7 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_m7/iar/src/tx_iar.c b/ports/cortex_m7/iar/src/tx_iar.c new file mode 100644 index 00000000..dd719370 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_m7/iar/src/tx_misra.s b/ports/cortex_m7/iar/src/tx_misra.s new file mode 100644 index 00000000..60ab3549 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_misra.s @@ -0,0 +1,1074 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** ThreadX MISRA Compliance */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + #define SHT_PROGBITS 0x1 + + EXTERN __aeabi_memset + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_interrupt_disable + EXTERN _tx_thread_interrupt_restore + EXTERN _tx_thread_stack_analyze + EXTERN _tx_thread_stack_error_handler + EXTERN _tx_thread_system_state +#ifdef TX_ENABLE_EVENT_TRACE + EXTERN _tx_trace_buffer_current_ptr + EXTERN _tx_trace_buffer_end_ptr + EXTERN _tx_trace_buffer_start_ptr + EXTERN _tx_trace_event_enable_bits + EXTERN _tx_trace_full_notify_function + EXTERN _tx_trace_header_ptr +#endif + + PUBLIC _tx_misra_always_true + PUBLIC _tx_misra_block_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_byte_pool_to_uchar_pointer_convert + PUBLIC _tx_misra_char_to_uchar_pointer_convert + PUBLIC _tx_misra_const_char_to_char_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_entry_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_indirect_void_to_uchar_pointer_convert + PUBLIC _tx_misra_memset + PUBLIC _tx_misra_message_copy +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_object_to_uchar_pointer_convert +#endif + PUBLIC _tx_misra_pointer_to_ulong_convert + PUBLIC _tx_misra_status_get + PUBLIC _tx_misra_thread_stack_check +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_time_stamp_get +#endif + PUBLIC _tx_misra_timer_indirect_to_void_pointer_convert + PUBLIC _tx_misra_timer_pointer_add + PUBLIC _tx_misra_timer_pointer_dif +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_trace_event_insert +#endif + PUBLIC _tx_misra_uchar_pointer_add + PUBLIC _tx_misra_uchar_pointer_dif + PUBLIC _tx_misra_uchar_pointer_sub + PUBLIC _tx_misra_uchar_to_align_type_pointer_convert + PUBLIC _tx_misra_uchar_to_block_pool_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_entry_pointer_convert + PUBLIC _tx_misra_uchar_to_header_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_indirect_byte_pool_pointer_convert + PUBLIC _tx_misra_uchar_to_indirect_uchar_pointer_convert +#ifdef TX_ENABLE_EVENT_TRACE + PUBLIC _tx_misra_uchar_to_object_pointer_convert +#endif + PUBLIC _tx_misra_uchar_to_void_pointer_convert + PUBLIC _tx_misra_ulong_pointer_add + PUBLIC _tx_misra_ulong_pointer_dif + PUBLIC _tx_misra_ulong_pointer_sub + PUBLIC _tx_misra_ulong_to_pointer_convert + PUBLIC _tx_misra_ulong_to_thread_pointer_convert + PUBLIC _tx_misra_user_timer_pointer_get + PUBLIC _tx_misra_void_to_block_pool_pointer_convert + PUBLIC _tx_misra_void_to_byte_pool_pointer_convert + PUBLIC _tx_misra_void_to_event_flags_pointer_convert + PUBLIC _tx_misra_void_to_indirect_uchar_pointer_convert + PUBLIC _tx_misra_void_to_mutex_pointer_convert + PUBLIC _tx_misra_void_to_queue_pointer_convert + PUBLIC _tx_misra_void_to_semaphore_pointer_convert + PUBLIC _tx_misra_void_to_thread_pointer_convert + PUBLIC _tx_misra_void_to_uchar_pointer_convert + PUBLIC _tx_misra_void_to_ulong_pointer_convert + PUBLIC _tx_misra_ipsr_get + PUBLIC _tx_misra_control_get + PUBLIC _tx_misra_control_set +#ifdef __ARMVFP__ + PUBLIC _tx_misra_fpccr_get + PUBLIC _tx_misra_vfp_touch +#endif + PUBLIC _tx_version_id + + + SECTION `.data`:DATA:REORDER:NOROOT(2) + DATA +// 51 CHAR _tx_version_id[100] = "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX 6.0 MISRA C Compliant *"; +_tx_version_id: + DC8 43H, 6FH, 70H, 79H, 72H, 69H, 67H, 68H + DC8 74H, 20H, 28H, 63H, 29H, 20H, 31H, 39H + DC8 39H, 36H, 2DH, 32H, 30H, 31H, 38H, 20H + DC8 45H, 78H, 70H, 72H, 65H, 73H, 73H, 20H + DC8 4CH, 6FH, 67H, 69H, 63H, 20H, 49H, 6EH + DC8 63H, 2EH, 20H, 2AH, 20H, 54H, 68H, 72H + DC8 65H, 61H, 64H, 58H, 20H, 35H, 2EH, 38H + DC8 20H, 4DH, 49H, 53H, 52H, 41H, 20H, 43H + DC8 20H, 43H, 6FH, 6DH, 70H, 6CH, 69H, 61H + DC8 6EH, 74H, 20H, 2AH, 0 + DC8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_memset(VOID *ptr, UINT value, UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_memset: + PUSH {R4,LR} + MOVS R4,R0 + MOVS R0,R2 + MOVS R2,R1 + MOVS R1,R0 + MOVS R0,R4 + BL __aeabi_memset + POP {R4,PC} ;; return + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_add(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_add: + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UCHAR *_tx_misra_uchar_pointer_sub(UCHAR *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_sub: + RSBS R1,R1,#+0 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_uchar_pointer_dif(UCHAR *ptr1, UCHAR *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_pointer_dif: + SUBS R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_pointer_to_ulong_convert(VOID *ptr); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_pointer_to_ulong_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_add(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG *_tx_misra_ulong_pointer_sub(ULONG *ptr, ULONG amount); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_sub: + MVNS R2,#+3 + MULS R1,R2,R1 + ADD R0,R0,R1 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_ulong_pointer_dif(ULONG *ptr1, ULONG *ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_ulong_to_pointer_convert(ULONG input); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_message_copy(ULONG **source, ULONG **destination, */ +/** UINT size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_message_copy: + PUSH {R4,R5} + LDR R3,[R0, #+0] + LDR R4,[R1, #+0] + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + CMP R2,#+2 + BCC.N ??_tx_misra_message_copy_0 + SUBS R2,R2,#+1 + B.N ??_tx_misra_message_copy_1 +??_tx_misra_message_copy_2: + LDR R5,[R3, #+0] + STR R5,[R4, #+0] + ADDS R4,R4,#+4 + ADDS R3,R3,#+4 + SUBS R2,R2,#+1 +??_tx_misra_message_copy_1: + CMP R2,#+0 + BNE.N ??_tx_misra_message_copy_2 +??_tx_misra_message_copy_0: + STR R3,[R0, #+0] + STR R4,[R1, #+0] + POP {R4,R5} + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_timer_pointer_dif(TX_TIMER_INTERNAL **ptr1, */ +/** TX_TIMER_INTERNAL **ptr2); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_dif: + SUBS R0,R0,R1 + ASRS R0,R0,#+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** TX_TIMER_INTERNAL **_tx_misra_timer_pointer_add(TX_TIMER_INTERNAL */ +/** **ptr1, ULONG size); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_pointer_add: + ADD R0,R0,R1, LSL #+2 + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_user_timer_pointer_get(TX_TIMER_INTERNAL */ +/** *internal_timer, TX_TIMER **user_timer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_user_timer_pointer_get: + ADDS R2,R0,#+8 + SUBS R2,R2,R0 + RSBS R2,R2,#+0 + ADD R0,R0,R2 + STR R0,[R1, #+0] + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_thread_stack_check(TX_THREAD *thread_ptr, */ +/** VOID **highest_stack); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_thread_stack_check: + PUSH {R3-R5,LR} + MOVS R4,R0 + MOVS R5,R1 + BL _tx_thread_interrupt_disable + CMP R4,#+0 + BEQ.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+0] + LDR.N R2,??DataTable2 ;; 0x54485244 + CMP R1,R2 + BNE.N ??_tx_misra_thread_stack_check_0 + LDR R1,[R4, #+8] + LDR R2,[R5, #+0] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_1 + LDR R1,[R4, #+8] + STR R1,[R5, #+0] +??_tx_misra_thread_stack_check_1: + LDR R1,[R4, #+12] + LDR R1,[R1, #+0] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R4, #+16] + LDR R1,[R1, #+1] + CMP R1,#-269488145 + BNE.N ??_tx_misra_thread_stack_check_2 + LDR R1,[R5, #+0] + LDR R2,[R4, #+12] + CMP R1,R2 + BCS.N ??_tx_misra_thread_stack_check_3 +??_tx_misra_thread_stack_check_2: + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_error_handler + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_3: + LDR R1,[R5, #+0] + LDR R1,[R1, #-4] + CMP R1,#-269488145 + BEQ.N ??_tx_misra_thread_stack_check_0 + BL _tx_thread_interrupt_restore + MOVS R0,R4 + BL _tx_thread_stack_analyze + BL _tx_thread_interrupt_disable +??_tx_misra_thread_stack_check_0: + BL _tx_thread_interrupt_restore + POP {R0,R4,R5,PC} ;; return + +#ifdef TX_ENABLE_EVENT_TRACE + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID _tx_misra_trace_event_insert(ULONG event_id, */ +/** VOID *info_field_1, ULONG info_field_2, ULONG info_field_3, */ +/** ULONG info_field_4, ULONG filter, ULONG time_stamp); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_trace_event_insert: + PUSH {R3-R7,LR} + LDR.N R4,??DataTable2_1 + LDR R4,[R4, #+0] + CMP R4,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_2 + LDR R5,[R5, #+0] + LDR R6,[SP, #+28] + TST R5,R6 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R5,??DataTable2_3 + LDR R5,[R5, #+0] + LDR.N R6,??DataTable2_4 + LDR R6,[R6, #+0] + CMP R5,#+0 + BNE.N ??_tx_misra_trace_event_insert_1 + LDR R5,[R6, #+44] + LDR R7,[R6, #+60] + LSLS R7,R7,#+16 + ORRS R7,R7,#0x80000000 + ORRS R5,R7,R5 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_1: + CMP R5,#-252645136 + BCS.N ??_tx_misra_trace_event_insert_3 + MOVS R5,R6 + MOVS R6,#-1 + B.N ??_tx_misra_trace_event_insert_2 +??_tx_misra_trace_event_insert_3: + MOVS R6,#-252645136 + MOVS R5,#+0 +??_tx_misra_trace_event_insert_2: + STR R6,[R4, #+0] + STR R5,[R4, #+4] + STR R0,[R4, #+8] + LDR R0,[SP, #+32] + STR R0,[R4, #+12] + STR R1,[R4, #+16] + STR R2,[R4, #+20] + STR R3,[R4, #+24] + LDR R0,[SP, #+24] + STR R0,[R4, #+28] + ADDS R4,R4,#+32 + LDR.N R0,??DataTable2_5 + LDR R0,[R0, #+0] + CMP R4,R0 + BCC.N ??_tx_misra_trace_event_insert_4 + LDR.N R0,??DataTable2_6 + LDR R4,[R0, #+0] + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] + LDR.N R0,??DataTable2_8 + LDR R0,[R0, #+0] + CMP R0,#+0 + BEQ.N ??_tx_misra_trace_event_insert_0 + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + LDR.N R1,??DataTable2_8 + LDR R1,[R1, #+0] + BLX R1 + B.N ??_tx_misra_trace_event_insert_0 +??_tx_misra_trace_event_insert_4: + LDR.N R0,??DataTable2_1 + STR R4,[R0, #+0] + LDR.N R0,??DataTable2_7 + LDR R0,[R0, #+0] + STR R4,[R0, #+32] +??_tx_misra_trace_event_insert_0: + POP {R0,R4-R7,PC} ;; return + + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_1: + DC32 _tx_trace_buffer_current_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_2: + DC32 _tx_trace_event_enable_bits + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_5: + DC32 _tx_trace_buffer_end_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_6: + DC32 _tx_trace_buffer_start_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_7: + DC32 _tx_trace_header_ptr + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_8: + DC32 _tx_trace_full_notify_function + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ULONG _tx_misra_time_stamp_get(VOID); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_time_stamp_get: + MOVS R0,#+0 + BX LR ;; return + +#endif + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2: + DC32 0x54485244 + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_3: + DC32 _tx_thread_system_state + + SECTION `.text`:CODE:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA +??DataTable2_4: + DC32 _tx_thread_current_ptr + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_always_true(void); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_always_true: + MOVS R0,#+1 + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_indirect_void_to_uchar_pointer_convert(VOID **return_ptr); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_indirect_void_to_uchar_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_uchar_to_indirect_uchar_pointer_convert(UCHAR *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************/ +/***********************************************************************************/ +/** */ +/** UCHAR *_tx_misra_block_pool_to_uchar_pointer_convert(TX_BLOCK_POOL *pool); */ +/** */ +/***********************************************************************************/ +/***********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_block_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_void_to_block_pool_pointer_convert(VOID *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_block_pool_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** UCHAR *_tx_misra_void_to_uchar_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************/ +/************************************************************************************/ +/** */ +/** TX_BLOCK_POOL *_tx_misra_uchar_to_block_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************/ +/************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_block_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************/ +/**************************************************************************************/ +/** */ +/** UCHAR **_tx_misra_void_to_indirect_uchar_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************/ +/**************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_indirect_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** TX_BYTE_POOL *_tx_misra_void_to_byte_pool_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_byte_pool_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_byte_pool_to_uchar_pointer_convert(TX_BYTE_POOL *pool); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_byte_pool_to_uchar_pointer_convert: + BX LR ;; return + + +/*****************************************************************************************/ +/*****************************************************************************************/ +/** */ +/** ALIGN_TYPE *_tx_misra_uchar_to_align_type_pointer_convert(UCHAR *pointer); */ +/** */ +/*****************************************************************************************/ +/*****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_align_type_pointer_convert: + BX LR ;; return + + +/****************************************************************************************************/ +/****************************************************************************************************/ +/** */ +/** TX_BYTE_POOL **_tx_misra_uchar_to_indirect_byte_pool_pointer_convert(UCHAR *pointer); */ +/** */ +/****************************************************************************************************/ +/****************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_indirect_byte_pool_pointer_convert: + BX LR ;; return + + +/**************************************************************************************************/ +/**************************************************************************************************/ +/** */ +/** TX_EVENT_FLAGS_GROUP *_tx_misra_void_to_event_flags_pointer_convert(VOID *pointer); */ +/** */ +/**************************************************************************************************/ +/**************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_event_flags_pointer_convert: + BX LR ;; return + + +/*****************************************************************************/ +/*****************************************************************************/ +/** */ +/** ULONG *_tx_misra_void_to_ulong_pointer_convert(VOID *pointer); */ +/** */ +/*****************************************************************************/ +/*****************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_ulong_pointer_convert: + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_MUTEX *_tx_misra_void_to_mutex_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_mutex_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** UINT _tx_misra_status_get(UINT status); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_status_get: + MOVS R0,#+0 + BX LR ;; return + + +/********************************************************************************/ +/********************************************************************************/ +/** */ +/** TX_QUEUE *_tx_misra_void_to_queue_pointer_convert(VOID *pointer); */ +/** */ +/********************************************************************************/ +/********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_queue_pointer_convert: + BX LR ;; return + + +/****************************************************************************************/ +/****************************************************************************************/ +/** */ +/** TX_SEMAPHORE *_tx_misra_void_to_semaphore_pointer_convert(VOID *pointer); */ +/** */ +/****************************************************************************************/ +/****************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_semaphore_pointer_convert: + BX LR ;; return + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** VOID *_tx_misra_uchar_to_void_pointer_convert(UCHAR *pointer); */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_void_pointer_convert: + BX LR ;; return + + +/*********************************************************************************/ +/*********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_ulong_to_thread_pointer_convert(ULONG value); */ +/** */ +/*********************************************************************************/ +/*********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ulong_to_thread_pointer_convert: + BX LR ;; return + + +/***************************************************************************************************/ +/***************************************************************************************************/ +/** */ +/** VOID *_tx_misra_timer_indirect_to_void_pointer_convert(TX_TIMER_INTERNAL **pointer); */ +/** */ +/***************************************************************************************************/ +/***************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_timer_indirect_to_void_pointer_convert: + BX LR ;; return + + +/***************************************************************************************/ +/***************************************************************************************/ +/** */ +/** CHAR *_tx_misra_const_char_to_char_pointer_convert(const char *pointer); */ +/** */ +/***************************************************************************************/ +/***************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_const_char_to_char_pointer_convert: + BX LR ;; return + + +/**********************************************************************************/ +/**********************************************************************************/ +/** */ +/** TX_THREAD *_tx_misra_void_to_thread_pointer_convert(void *pointer); */ +/** */ +/**********************************************************************************/ +/**********************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_void_to_thread_pointer_convert: + BX LR ;; return + + +#ifdef TX_ENABLE_EVENT_TRACE + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_object_to_uchar_pointer_convert(TX_TRACE_OBJECT_ENTRY *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_object_to_uchar_pointer_convert: + BX LR ;; return + + +/************************************************************************************************/ +/************************************************************************************************/ +/** */ +/** TX_TRACE_OBJECT_ENTRY *_tx_misra_uchar_to_object_pointer_convert(UCHAR *pointer); */ +/** */ +/************************************************************************************************/ +/************************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_object_pointer_convert: + BX LR ;; return + + +/******************************************************************************************/ +/******************************************************************************************/ +/** */ +/** TX_TRACE_HEADER *_tx_misra_uchar_to_header_pointer_convert(UCHAR *pointer); */ +/** */ +/******************************************************************************************/ +/******************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_header_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** TX_TRACE_BUFFER_ENTRY *_tx_misra_uchar_to_entry_pointer_convert(UCHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_uchar_to_entry_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_entry_to_uchar_pointer_convert(TX_TRACE_BUFFER_ENTRY *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_entry_to_uchar_pointer_convert: + BX LR ;; return +#endif + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** UCHAR *_tx_misra_char_to_uchar_pointer_convert(CHAR *pointer); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_char_to_uchar_pointer_convert: + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_ipsr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_ipsr_get: + MRS R0, IPSR + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_control_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_get: + MRS R0, CONTROL + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_control_set(ULONG value); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_control_set: + MSR CONTROL, R0 + BX LR ;; return + + +#ifdef __ARMVFP__ + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** ULONG _tx_misra_fpccr_get(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(2) + THUMB +_tx_misra_fpccr_get: + LDR r0, =0xE000EF34 ; Build FPCCR address + LDR r0, [r0] ; Load FPCCR value + BX LR ;; return + + +/***********************************************************************************************/ +/***********************************************************************************************/ +/** */ +/** void _tx_misra_vfp_touch(void); */ +/** */ +/***********************************************************************************************/ +/***********************************************************************************************/ + + SECTION `.text`:CODE:NOROOT(1) + THUMB +_tx_misra_vfp_touch: + vmov.f32 s0, s0 + BX LR ;; return + +#endif + + + SECTION `.iar_vfe_header`:DATA:NOALLOC:NOROOT(2) + SECTION_TYPE SHT_PROGBITS, 0 + DATA + DC32 0 + + END diff --git a/ports/cortex_m7/iar/src/tx_thread_context_restore.s b/ports/cortex_m7/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..f671f2d4 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_context_restore.s @@ -0,0 +1,105 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + PUBLIC _tx_thread_context_restore +_tx_thread_context_restore: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + PUSH {r0,lr} ; Save ISR lr + BL _tx_execution_isr_exit ; Call the ISR exit function + POP {r0,lr} ; Restore ISR lr +#endif +; + POP {lr} + BX lr +; +;} + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_context_save.s b/ports/cortex_m7/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..1febcc18 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_context_save.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + PUBLIC _tx_thread_context_save +_tx_thread_context_save: +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is starting. */ +; + PUSH {r0, lr} ; Save return address + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {r0, lr} ; Recover return address +#endif +; +; /* Context is already saved - just return! */ +; + BX lr +;} + END diff --git a/ports/cortex_m7/iar/src/tx_thread_interrupt_control.s b/ports/cortex_m7/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..2e95e0f7 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,86 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_control +_tx_thread_interrupt_control: +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r1, PRIMASK + MSR PRIMASK, r0 + MOV r0, r1 + BX lr +; +;} + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..e435b0b8 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts and returning */ +;/* the previous interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_disable +_tx_thread_interrupt_disable: +; +; /* Return current interrupt lockout posture. */ +; + MRS r0, PRIMASK + CPSID i + BX lr +; +;} + END diff --git a/ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..cfdb140d --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,83 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring the previous */ +;/* interrupt lockout posture. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* previous_posture Previous interrupt posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_interrupt_restore(UINT new_posture) +;{ + PUBLIC _tx_thread_interrupt_restore +_tx_thread_interrupt_restore: +; +; /* Restore previous interrupt lockout posture. */ +; + MSR PRIMASK, r0 + BX lr +; +;} + END diff --git a/ports/cortex_m7/iar/src/tx_thread_schedule.s b/ports/cortex_m7/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..4e97613c --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_schedule.s @@ -0,0 +1,291 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_execution_thread_enter + EXTERN _tx_execution_thread_exit + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + PUBLIC _tx_thread_schedule +_tx_thread_schedule: +; +; /* This function should only ever be called on Cortex-M +; from the first schedule request. Subsequent scheduling occurs +; from the PendSV handling routines below. */ +; +; /* Clear the preempt-disable flag to enable rescheduling after initialization on Cortex-M targets. */ +; + MOV r0, #0 ; Build value for TX_FALSE + LDR r2, =_tx_thread_preempt_disable ; Build address of preempt disable flag + STR r0, [r2, #0] ; Clear preempt disable flag +; +; /* Clear CONTROL.FPCA bit so VFP registers aren't unnecessarily stacked. */ +; +#ifdef __ARMVFP__ + MRS r0, CONTROL ; Pickup current CONTROL register + BIC r0, r0, #4 ; Clear the FPCA bit + MSR CONTROL, r0 ; Setup new CONTROL register +#endif +; +; /* Enable interrupts */ +; + CPSIE i +; +; /* Enter the scheduler for the first time. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + DSB ; Complete all memory accesses + ISB ; Flush pipeline +; +; /* Wait here for the PendSV to take place. */ +; +__tx_wait_here: + B __tx_wait_here ; Wait for the PendSV to happen +;} +; +; /* Generic context PendSV handler. */ +; + PUBLIC PendSV_Handler + PUBLIC __tx_PendSVHandler +PendSV_Handler: +__tx_PendSVHandler: +; +; /* Get current thread value and new thread pointer. */ +; +__tx_ts_handler: + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + CPSID i ; Disable interrupts + PUSH {r0, lr} ; Save LR (and r0 just for alignment) + BL _tx_execution_thread_exit ; Call the thread exit function + POP {r0, lr} ; Recover LR + CPSIE i ; Enable interrupts +#endif + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + MOV r3, #0 ; Build NULL value + LDR r1, [r0] ; Pickup current thread pointer +; +; /* Determine if there is a current thread to finish preserving. */ +; + CBZ r1, __tx_ts_new ; If NULL, skip preservation +; +; /* Recover PSP and preserve current thread context. */ +; + STR r3, [r0] ; Set _tx_thread_current_ptr to NULL + MRS r12, PSP ; Pickup PSP pointer (thread's stack pointer) + STMDB r12!, {r4-r11} ; Save its remaining registers +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_save + VSTMDB r12!,{s16-s31} ; Yes, save additional VFP registers +_skip_vfp_save: +#endif + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + STMDB r12!, {LR} ; Save LR on the stack +; +; /* Determine if time-slice is active. If it isn't, skip time handling processing. */ +; + LDR r5, [r4] ; Pickup current time-slice + STR r12, [r1, #8] ; Save the thread stack pointer + CBZ r5, __tx_ts_new ; If not active, skip processing +; +; /* Time-slice is active, save the current thread's time-slice and clear the global time-slice variable. */ +; + STR r5, [r1, #24] ; Save current time-slice +; +; /* Clear the global time-slice. */ +; + STR r3, [r4] ; Clear time-slice +; +; +; /* Executing thread is now completely preserved!!! */ +; +__tx_ts_new: +; +; /* Now we are looking for a new thread to execute! */ +; + CPSID i ; Disable interrupts + LDR r1, [r2] ; Is there another thread ready to execute? + CBZ r1, __tx_ts_wait ; No, skip to the wait processing +; +; /* Yes, another thread is ready for else, make the current thread the new thread. */ +; + STR r1, [r0] ; Setup the current thread pointer to the new thread + CPSIE i ; Enable interrupts +; +; /* Increment the thread run count. */ +; +__tx_ts_restore: + LDR r7, [r1, #4] ; Pickup the current thread run count + MOV32 r4, _tx_timer_time_slice ; Build address of time-slice variable + LDR r5, [r1, #24] ; Pickup thread's current time-slice + ADD r7, r7, #1 ; Increment the thread run count + STR r7, [r1, #4] ; Store the new run count +; +; /* Setup global time-slice with thread's current time-slice. */ +; + STR r5, [r4] ; Setup global time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + PUSH {r0, r1} ; Save r0/r1 + BL _tx_execution_thread_enter ; Call the thread execution enter function + POP {r0, r1} ; Recover r3 +#endif +; +; /* Restore the thread context and PSP. */ +; + LDR r12, [r1, #8] ; Pickup thread's stack pointer + LDMIA r12!, {LR} ; Pickup LR +#ifdef __ARMVFP__ + TST LR, #0x10 ; Determine if the VFP extended frame is present + BNE _skip_vfp_restore ; If not, skip VFP restore + VLDMIA r12!, {s16-s31} ; Yes, restore additional VFP registers +_skip_vfp_restore: +#endif + LDMIA r12!, {r4-r11} ; Recover thread's registers + MSR PSP, r12 ; Setup the thread's stack pointer +; +; /* Return to thread. */ +; + BX lr ; Return to thread! +; +; /* The following is the idle wait processing... in this case, no threads are ready for execution and the +; system will simply be idle until an interrupt occurs that makes a thread ready. Note that interrupts +; are disabled to allow use of WFI for waiting for a thread to arrive. */ +; +__tx_ts_wait: + CPSID i ; Disable interrupts + LDR r1, [r2] ; Pickup the next thread to execute pointer + STR r1, [r0] ; Store it in the current pointer + CBNZ r1, __tx_ts_ready ; If non-NULL, a new thread is ready! +#ifdef TX_ENABLE_WFI + DSB ; Ensure no outstanding memory transactions + WFI ; Wait for interrupt + ISB ; Ensure pipeline is flushed +#endif + CPSIE i ; Enable interrupts + B __tx_ts_wait ; Loop to continue waiting +; +; /* At this point, we have a new thread ready to go. Clear any newly pended PendSV - since we are +; already in the handler! */ +; +__tx_ts_ready: + MOV r7, #0x08000000 ; Build clear PendSV value + MOV r8, #0xE000E000 ; Build base NVIC address + STR r7, [r8, #0xD04] ; Clear any PendSV +; +; /* Re-enable interrupts and restore new thread. */ +; + CPSIE i ; Enable interrupts + B __tx_ts_restore ; Restore the thread +;} +; +#ifdef __ARMVFP__ + + PUBLIC tx_thread_fpu_enable +tx_thread_fpu_enable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + + PUBLIC tx_thread_fpu_disable +tx_thread_fpu_disable: +; +; /* Automatic VPF logic is supported, this function is present only for +; backward compatibility purposes and therefore simply returns. */ +; + BX LR ; Return to caller + +#endif + + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_stack_build.s b/ports/cortex_m7/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..36518e5e --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_stack_build.s @@ -0,0 +1,144 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + PUBLIC _tx_thread_stack_build +_tx_thread_stack_build: +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-M7 should look like the following after it is built: +; +; Stack Top: +; LR Interrupted LR (LR at time of PENDSV) +; r4 Initial value for r4 +; r5 Initial value for r5 +; r6 Initial value for r6 +; r7 Initial value for r7 +; r8 Initial value for r8 +; r9 Initial value for r9 +; r10 Initial value for r10 +; r11 Initial value for r11 +; r0 Initial value for r0 (Hardware stack starts here!!) +; r1 Initial value for r1 +; r2 Initial value for r2 +; r3 Initial value for r3 +; r12 Initial value for r12 +; lr Initial value for lr +; pc Initial value for pc +; xPSR Initial value for xPSR +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #0x7 ; Align frame for 8-byte alignment + SUB r2, r2, #68 ; Subtract frame size + LDR r3, =0xFFFFFFFD ; Build initial LR value + STR r3, [r2, #0] ; Save on the stack +; +; /* Actually build the stack frame. */ +; + MOV r3, #0 ; Build initial register value + STR r3, [r2, #4] ; Store initial r4 + STR r3, [r2, #8] ; Store initial r5 + STR r3, [r2, #12] ; Store initial r6 + STR r3, [r2, #16] ; Store initial r7 + STR r3, [r2, #20] ; Store initial r8 + STR r3, [r2, #24] ; Store initial r9 + STR r3, [r2, #28] ; Store initial r10 + STR r3, [r2, #32] ; Store initial r11 +; +; /* Hardware stack follows. / +; + STR r3, [r2, #36] ; Store initial r0 + STR r3, [r2, #40] ; Store initial r1 + STR r3, [r2, #44] ; Store initial r2 + STR r3, [r2, #48] ; Store initial r3 + STR r3, [r2, #52] ; Store initial r12 + MOV r3, #0xFFFFFFFF ; Poison EXC_RETURN value + STR r3, [r2, #56] ; Store initial lr + STR r1, [r2, #60] ; Store initial pc + MOV r3, #0x01000000 ; Only T-bit need be set + STR r3, [r2, #64] ; Store initial xPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_m7/iar/src/tx_thread_system_return.s b/ports/cortex_m7/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..126a9c78 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_thread_system_return.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + PUBLIC _tx_thread_system_return +_tx_thread_system_return??rA: +_tx_thread_system_return: +; +; /* Return to real scheduler via PendSV. Note that this routine is often +; replaced with in-line assembly in tx_port.h to improved performance. */ +; + MOV r0, #0x10000000 ; Load PENDSVSET bit + MOV r1, #0xE000E000 ; Load NVIC base + STR r0, [r1, #0xD04] ; Set PENDSVBIT in ICSR + MRS r0, IPSR ; Pickup IPSR + CMP r0, #0 ; Is it a thread returning? + BNE _isr_context ; If ISR, skip interrupt enable + MRS r1, PRIMASK ; Thread context returning, pickup PRIMASK + CPSIE i ; Enable interrupts + MSR PRIMASK, r1 ; Restore original interrupt posture +_isr_context: + BX lr ; Return to caller +;} + END diff --git a/ports/cortex_m7/iar/src/tx_timer_interrupt.s b/ports/cortex_m7/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..c900f267 --- /dev/null +++ b/ports/cortex_m7/iar/src/tx_timer_interrupt.s @@ -0,0 +1,268 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_preempt_disable +; +; + SECTION `.text`:CODE:NOROOT(2) + THUMB +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-M7/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* the expiration functions are called. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + PUBLIC _tx_timer_interrupt +_tx_timer_interrupt: +; +; /* Upon entry to this routine, it is assumed that the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + MOV32 r1, _tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + MOV32 r3, _tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CBZ r2, __tx_timer_no_time_slice ; Is it non-active? + ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CBNZ r2, __tx_timer_no_time_slice ; Has it expired? +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice: +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + MOV32 r1, _tx_timer_current_ptr ; Pickup current timer pointer address + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CBZ r2, __tx_timer_no_timer ; Is there anything in the list? + ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + MOV32 r3, _tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer: +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + MOV32 r3, _tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + MOV32 r3, _tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap: +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done: +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CBNZ r2, __tx_something_expired ; Did a time-slice expire? + ; If non-zero, time-slice expired + MOV32 r1, _tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_nothing_expired ; Did a timer expire? + ; No, nothing expired +; +__tx_something_expired: +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + MOV32 r1, _tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CBZ r0, __tx_timer_dont_activate ; Check for timer expiration + ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate: +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + MOV32 r3, _tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CBZ r2, __tx_timer_not_ts_expiration ; See if the flag is set + ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing + MOV32 r0, _tx_thread_preempt_disable ; Build address of preempt disable flag + LDR r1, [r0] ; Is the preempt disable flag set? + CBNZ r1, __tx_timer_skip_time_slice ; Yes, skip the PendSV logic + MOV32 r0, _tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup the current thread pointer + MOV32 r2, _tx_thread_execute_ptr ; Build execute thread pointer address + LDR r3, [r2] ; Pickup the execute thread pointer + MOV32 r0, 0xE000ED04 ; Build address of control register + MOV32 r2, 0x10000000 ; Build value for PendSV bit + CMP r1, r3 ; Are they the same? + BEQ __tx_timer_skip_time_slice ; If the same, there was no time-slice performed + STR r2, [r0] ; Not the same, issue the PendSV for preemption +__tx_timer_skip_time_slice: +; +; } +; +__tx_timer_not_ts_expiration: +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired: + + DSB ; Complete all memory access + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_r4/ac5/example_build/build_threadx.bat b/ports/cortex_r4/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..74f59d4d --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-r4 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-r4 --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-r4 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r4/ac5/example_build/build_threadx_sample.bat b/ports/cortex_r4/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..20c1b323 --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-r4 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-r4 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_r4/ac5/example_build/sample_threadx.c b/ports/cortex_r4/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..330e7865 --- /dev/null +++ b/ports/cortex_r4/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-R4 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_r4/ac5/inc/tx_port.h b/ports/cortex_r4/ac5/inc/tx_port.h new file mode 100644 index 00000000..75238e40 --- /dev/null +++ b/ports/cortex_r4/ac5/inc/tx_port.h @@ -0,0 +1,335 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-R4. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + diff --git a/ports/cortex_r4/ac5/readme_threadx.txt b/ports/cortex_r4/ac5/readme_threadx.txt new file mode 100644 index 00000000..93ef3dbc --- /dev/null +++ b/ports/cortex_r4/ac5/readme_threadx.txt @@ -0,0 +1,549 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R4 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-R4 Specifies Cortex-R4 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R4 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-R4 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R4 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + +Note that if VFP registers are used in ISRs, the save/restore of VFP registers must be done by the ISR. +In addition, the startup code is responsible for enabling VFP usage. + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R4 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/ac5/src/tx_thread_context_restore.s b/ports/cortex_r4/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..b1f4023c --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,255 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_context_save.s b/ports/cortex_r4/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..f6bde687 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..79ddc37e --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save ; No, skip VFP FIQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_fiq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..75325f33 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..e4727145 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..24f4689d --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..984102e0 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..da0cae5c --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..021d8f95 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..6ad5dcf4 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..5fcd5382 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_schedule.s b/ports/cortex_r4/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..a9f7f55a --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_schedule.s @@ -0,0 +1,234 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 + ENDIF +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MSR CPSR_cxsf, r5 ; Recover CPSR + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_stack_build.s b/ports/cortex_r4/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..053db0e1 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R4 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_system_return.s b/ports/cortex_r4/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..4c5b0d28 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_system_return.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + MRS r1, CPSR ; Pickup the CPSR + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save the current remaining time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Store current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..be161ce7 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_r4/ac5/src/tx_timer_interrupt.s b/ports/cortex_r4/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..f6482e30 --- /dev/null +++ b/ports/cortex_r4/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R4/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/.cproject b/ports/cortex_r4/ac6/example_build/sample_threadx/.cproject new file mode 100644 index 00000000..ba7c73aa --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/.cproject @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/.project b/ports/cortex_r4/ac6/example_build/sample_threadx/.project new file mode 100644 index 00000000..a1b15572 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/.project @@ -0,0 +1,26 @@ + + + sample_threadx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml b/ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml new file mode 100644 index 00000000..9fa316ab --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch b/ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch new file mode 100644 index 00000000..37577868 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/cortex-r4_tx.launch @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/gic.c b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.c new file mode 100644 index 00000000..32f21bbe --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.c @@ -0,0 +1,239 @@ +/** GIC start **/ +/* ------------------------- Interrupt Number Definition ------------------------ */ + +#include "gic.h" + +#define VE_R4_GIC_DISTRIBUTOR_BASE (0xAE001000UL) /*!< (PL390 GIC Distributor ) Base Address */ +#define VE_R4_GIC_INTERFACE_BASE (0xAE000000UL) /*!< (PL390 GIC CPU Interface) Base Address */ + +#define GICDistributor ((GICDistributor_Type *) VE_R4_GIC_DISTRIBUTOR_BASE ) /*!< GIC Distributor configuration struct */ +#define GICInterface ((GICInterface_Type *) VE_R4_GIC_INTERFACE_BASE ) /*!< GIC Interface configuration struct */ + +/* Globals for use of post-scatterloading code that must access GIC */ +const uint32_t GICDistributor_BASE = VE_R4_GIC_DISTRIBUTOR_BASE; +const uint32_t GICInterface_BASE = VE_R4_GIC_INTERFACE_BASE; + +#if 0 + +void GIC_SetICDICFR (const uint32_t *ICDICFRn) +{ + uint32_t i, num_irq; + + //Get the maximum number of interrupts that the GIC supports + num_irq = 32 * ((GIC_DistributorInfo() & 0x1f) + 1); + + for (i = 0; i < (num_irq/16); i++) + { + GICDistributor->ICDISPR[i] = *ICDICFRn++; + } +} + +uint32_t GIC_DistributorImplementer(void) +{ + return (uint32_t)(GICDistributor->ICDIIDR); +} + +uint32_t GIC_GetTarget(IRQn_Type IRQn) +{ + char* field = (char*)&(GICDistributor->ICDIPTR[IRQn / 4]); + field += IRQn % 4; + return ((uint32_t)*field & 0xf); +} + +IRQn_Type GIC_AcknowledgePending(void) +{ + return (IRQn_Type)(GICInterface->ICCIAR); +} + +uint32_t GIC_GetBinaryPoint(uint32_t binary_point) +{ + return (uint32_t)GICInterface->ICCBPR; +} + +uint32_t GIC_GetIRQStatus(IRQn_Type IRQn) +{ + uint32_t pending, active; + + active = ((GICDistributor->ICDABR[IRQn / 32]) >> (IRQn % 32)) & 0x1; + pending =((GICDistributor->ICDISPR[IRQn / 32]) >> (IRQn % 32)) & 0x1; + + return ((active<<1) | pending); +} + +void GIC_SendSGI(IRQn_Type IRQn, uint32_t target_list, uint32_t filter_list) +{ + GICDistributor->ICDSGIR = ((filter_list & 0x3) << 24) | ((target_list & 0xff) << 16) | (IRQn & 0xf); +} + +void GIC_EndInterrupt(IRQn_Type IRQn) +{ + GICInterface->ICCEOIR = IRQn; +} + +void GIC_SetPendingIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDISPR[IRQn / 32] = 1 << (IRQn % 32); +} + +void GIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDICPR[IRQn / 32] = 1 << (IRQn % 32); +} +#endif + +void GIC_EnableDistributor(void) +{ + GICDistributor->ICDDCR |= 1; //enable distributor +} + +void GIC_DisableDistributor(void) +{ + GICDistributor->ICDDCR &=~1; //disable distributor +} + +void GIC_SetTarget(IRQn_Type IRQn, uint32_t cpu_target) +{ + char* field = (char*)&(GICDistributor->ICDIPTR[IRQn / 4]); + field += IRQn % 4; + *field = (char)cpu_target & 0xf; +} + +void GIC_EnableInterface(void) +{ + GICInterface->ICCICR |= 1; //enable interface +} + +void GIC_DisableInterface(void) +{ + GICInterface->ICCICR &=~1; //disable distributor +} + +void GIC_EnableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDISER[IRQn / 32] = 1 << (IRQn % 32); +} + +void GIC_DisableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICDICER[IRQn / 32] = 1 << (IRQn % 32); +} + +uint32_t GIC_DistributorInfo(void) +{ + return (uint32_t)(GICDistributor->ICDICTR); +} + + +void GIC_SetLevelModel(IRQn_Type IRQn, int8_t edge_level, int8_t model) +{ // Word-size read/writes must be used to access this register + volatile uint32_t * field = &(GICDistributor->ICDICFR[IRQn / 16]); + unsigned bit_shift = (IRQn % 16)<<1; + unsigned int save_word; + + save_word = *field; + save_word &= (~(3 << bit_shift)); + + *field = (save_word | (((edge_level<<1) | model) << bit_shift)); +} + +void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + char* field = (char*)&(GICDistributor->ICDIPR[IRQn / 4]); + field += IRQn % 4; + *field = (char)priority; +} + +uint32_t GIC_GetPriority(IRQn_Type IRQn) +{ + char* field = (char*)&(GICDistributor->ICDIPR[IRQn / 4]); + field += IRQn % 4; + return (uint32_t)*field; +} + +void GIC_InterfacePriorityMask(uint32_t priority) +{ + GICInterface->ICCPMR = priority & 0xff; //set priority mask +} + +void GIC_SetBinaryPoint(uint32_t binary_point) +{ + GICInterface->ICCBPR = binary_point & 0x07; //set binary point +} + +void GIC_DistInit(void) +{ + IRQn_Type i; + uint32_t num_irq = 0; + uint32_t priority_field; + + //A reset sets all bits in the ICDISRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableDistributor(); + //Get the maximum number of interrupts that the GIC supports + num_irq = 32 * ((GIC_DistributorInfo() & 0x1f) + 1); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an ICDIPR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0, 0xff); + priority_field = GIC_GetPriority((IRQn_Type)0); + + for (i = (IRQn_Type)32; i < num_irq; i++) + { + //Disable the SPI interrupt + GIC_DisableIRQ(i); + //Set level-sensitive and 1-N model + GIC_SetLevelModel(i, 0, 1); + //Set priority + GIC_SetPriority(i, priority_field/2); + //Set target list to CPU0 + GIC_SetTarget(i, 1); + } + //Enable distributor + GIC_EnableDistributor(); +} + +void GIC_CPUInterfaceInit(void) +{ + IRQn_Type i; + uint32_t priority_field; + + //A reset sets all bits in the ICDISRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableInterface(); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an ICDIPR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0, 0xff); + priority_field = GIC_GetPriority((IRQn_Type)0); + + //SGI and PPI + for (i = (IRQn_Type)0; i < 32; i++) + { + //Set level-sensitive and 1-N model for PPI + if(i > 15) + GIC_SetLevelModel(i, 0, 1); + //Disable SGI and PPI interrupts + GIC_DisableIRQ(i); + //Set priority + GIC_SetPriority(i, priority_field/2); + } + //Enable interface + GIC_EnableInterface(); + //Set binary point to 0 + GIC_SetBinaryPoint(0); + //Set priority mask + GIC_InterfacePriorityMask(0xff); +} + +void GIC_Enable(void) +{ + GIC_DistInit(); + GIC_CPUInterfaceInit(); //per CPU +} +/** GIC end **/ diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/gic.h b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.h new file mode 100644 index 00000000..7891f74f --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/gic.h @@ -0,0 +1,360 @@ +/**************************************************************************//** + * @file gic.h + * @brief Generic Interrupt Controller (GIC) functions + * @version + * @date 29 August 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2011 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + +#ifndef GIC_H_ +#define GIC_H_ + +#include "stdint.h" + +typedef enum IRQn +{ +/****** SGI Interrupts Numbers ****************************************/ + SGI0_IRQn = 0, + SGI1_IRQn = 1, + SGI2_IRQn = 2, + SGI3_IRQn = 3, + SGI4_IRQn = 4, + SGI5_IRQn = 5, + SGI6_IRQn = 6, + SGI7_IRQn = 7, + SGI8_IRQn = 8, + SGI9_IRQn = 9, + SGI10_IRQn = 10, + SGI11_IRQn = 11, + SGI12_IRQn = 12, + SGI13_IRQn = 13, + SGI14_IRQn = 14, + SGI15_IRQn = 15, + +/****** Cortex-R4 Processor Exceptions Numbers ****************************************/ + PrivTimer_IRQn = 34, /*!< Private Timer Interrupt */ + +/****** Platform Exceptions Numbers ***************************************************/ + Watchdog_IRQn = 32, /*!< SP805 Interrupt */ + Timer0_IRQn = 34, /*!< SP804 Interrupt */ + Timer1_IRQn = 35, /*!< SP804 Interrupt */ + RTClock_IRQn = 36, /*!< PL031 Interrupt */ + UART0_IRQn = 37, /*!< PL011 Interrupt */ + UART1_IRQn = 38, /*!< PL011 Interrupt */ + UART2_IRQn = 39, /*!< PL011 Interrupt */ + UART3_IRQn = 40, /*!< PL011 Interrupt */ + MCI0_IRQn = 41, /*!< PL180 Interrupt (1st) */ + MCI1_IRQn = 42, /*!< PL180 Interrupt (2nd) */ + AACI_IRQn = 43, /*!< PL041 Interrupt */ + Keyboard_IRQn = 44, /*!< PL050 Interrupt */ + Mouse_IRQn = 45, /*!< PL050 Interrupt */ + CLCD_IRQn = 46, /*!< PL111 Interrupt */ + Ethernet_IRQn = 47, /*!< SMSC_91C111 Interrupt */ + VFS2_IRQn = 73, /*!< VFS2 Interrupt */ +} IRQn_Type; + +/* IO definitions (access restrictions to peripheral registers) */ +/** +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/** \brief Structure type to access the Generic Interrupt Controller Distributor (GICD) + */ +typedef struct +{ + __IO uint32_t ICDDCR; + __I uint32_t ICDICTR; + __I uint32_t ICDIIDR; + uint32_t RESERVED0[29]; + __IO uint32_t ICDISR[32]; + __IO uint32_t ICDISER[32]; + __IO uint32_t ICDICER[32]; + __IO uint32_t ICDISPR[32]; + __IO uint32_t ICDICPR[32]; + __I uint32_t ICDABR[32]; + uint32_t RESERVED1[32]; + __IO uint32_t ICDIPR[256]; + __IO uint32_t ICDIPTR[256]; + __IO uint32_t ICDICFR[64]; + uint32_t RESERVED2[128]; + __IO uint32_t ICDSGIR; +} GICDistributor_Type; + +/** \brief Structure type to access the Controller Interface (GICC) + */ +typedef struct +{ + __IO uint32_t ICCICR; // +0x000 - RW - CPU Interface Control Register + __IO uint32_t ICCPMR; // +0x004 - RW - Interrupt Priority Mask Register + __IO uint32_t ICCBPR; // +0x008 - RW - Binary Point Register + __I uint32_t ICCIAR; // +0x00C - RO - Interrupt Acknowledge Register + __IO uint32_t ICCEOIR; // +0x010 - WO - End of Interrupt Register + __I uint32_t ICCRPR; // +0x014 - RO - Running Priority Register + __I uint32_t ICCHPIR; // +0x018 - RO - Highest Pending Interrupt Register + __IO uint32_t ICCABPR; // +0x01C - RW - Aliased Binary Point Register + + uint32_t RESERVED[55]; + + __I uint32_t ICCIIDR; // +0x0FC - RO - CPU Interface Identification Register +} GICInterface_Type; + +/*@} end of GICD */ + +/* ########################## GIC functions #################################### */ +/** \brief Functions that manage interrupts via the GIC. + @{ + */ + +/** \brief Enable DistributorGICInterface->ICCICR |= 1; //enable interface + + Enables the forwarding of pending interrupts to the CPU interfaces. + + */ +void GIC_EnableDistributor(void); + +/** \brief Disable Distributor + + Disables the forwarding of pending interrupts to the CPU interfaces. + + */ +void GIC_DisableDistributor(void); + +/** \brief Provides information about the configuration of the GIC. + Provides information about the configuration of the GIC. + - whether the GIC implements the Security Extensions + - the maximum number of interrupt IDs that the GIC supports + - the number of CPU interfaces implemented + - if the GIC implements the Security Extensions, the maximum number of implemented Lockable Shared Peripheral Interrupts (LSPIs). + + \return Distributor Information. + */ +uint32_t GIC_DistributorInfo(void); + +/** \brief Distributor Implementer Identification Register. + + Distributor Implementer Identification Register + + \return Implementer Information. + */ +uint32_t GIC_DistributorImplementer(void); + +/** \brief Set list of processors that the interrupt is sent to if it is asserted. + + The ICDIPTRs provide an 8-bit CPU targets field for each interrupt supported by the GIC. + This field stores the list of processors that the interrupt is sent to if it is asserted. + + \param [in] IRQn Interrupt number. + \param [in] target CPU target + */ +void GIC_SetTarget(IRQn_Type IRQn, uint32_t cpu_target); + +/** \brief Get list of processors that the interrupt is sent to if it is asserted. + + The ICDIPTRs provide an 8-bit CPU targets field for each interrupt supported by the GIC. + This field stores the list of processors that the interrupt is sent to if it is asserted. + + \param [in] IRQn Interrupt number. + \param [in] target CPU target +*/ +uint32_t GIC_GetTarget(IRQn_Type IRQn); + +/** \brief Enable Interface + + Enables the signalling of interrupts to the target processors. + + */ +void GIC_EnableInterface(void); + +/** \brief Disable Interface + + Disables the signalling of interrupts to the target processors. + + */ +void GIC_DisableInterface(void); + +/** \brief Acknowledge Interrupt + + The function acknowledges the highest priority pending interrupt and returns its IRQ number. + + \return Interrupt number + */ +IRQn_Type GIC_AcknowledgePending(void); + +/** \brief End Interrupt + + The function writes the end of interrupt register, indicating that handling of the interrupt is complete. + + \param [in] IRQn Interrupt number. + */ +void GIC_EndInterrupt(IRQn_Type IRQn); + + +/** \brief Enable Interrupt + + Set-enable bit for each interrupt supported by the GIC. + + \param [in] IRQn External interrupt number. + */ +void GIC_EnableIRQ(IRQn_Type IRQn); + +/** \brief Disable Interrupt + + Clear-enable bit for each interrupt supported by the GIC. + + \param [in] IRQn Number of the external interrupt to disable + */ +void GIC_DisableIRQ(IRQn_Type IRQn); + +/** \brief Set Pending Interrupt + + Set-pending bit for each interrupt supported by the GIC. + + \param [in] IRQn Interrupt number. + */ +void GIC_SetPendingIRQ(IRQn_Type IRQn); + +/** \brief Clear Pending Interrupt + + Clear-pending bit for each interrupt supported by the GIC + + \param [in] IRQn Number of the interrupt for clear pending + */ +void GIC_ClearPendingIRQ(IRQn_Type IRQn); + +/** \brief Int_config field for each interrupt supported by the GIC. + + This field identifies whether the corresponding interrupt is: + (1) edge-triggered or (0) level-sensitive + (1) 1-N model or (0) N-N model + + \param [in] IRQn Interrupt number. + \param [in] edge_level (1) edge-triggered or (0) level-sensitive + \param [in] model (1) 1-N model or (0) N-N model + */ +void GIC_SetLevelModel(IRQn_Type IRQn, int8_t edge_level, int8_t model); + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority); + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + */ +uint32_t GIC_GetPriority(IRQn_Type IRQn); + +/** \brief CPU Interface Priority Mask Register + + The priority mask level for the CPU interface. If the priority of an interrupt is higher than the + value indicated by this field, the interface signals the interrupt to the processor. + + \param [in] Mask. + */ +void GIC_InterfacePriorityMask(uint32_t priority); + +/** \brief Set the binary point. + + Set the point at which the priority value fields split into two parts, the group priority field and the subpriority field. + + \param [in] Mask. + */ +void GIC_SetBinaryPoint(uint32_t binary_point); + +/** \brief Get the binary point. + + Get the point at which the priority value fields split into two parts, the group priority field and the subpriority field. + + \return Binary point. + */ +uint32_t GIC_GetBinaryPoint(uint32_t binary_point); + +/** \brief Get Interrupt state. + + Get the interrupt state, whether pending and/or active + + \return 0 - inactive, 1 - pending, 2 - active, 3 - pending and active + */ +uint32_t GIC_GetIRQStatus(IRQn_Type IRQn); + +/** \brief Send Software Generated interrupt + + Provides an interrupt priority filter. Only interrupts with higher priority than the value in this register can be signalled to the processor. +GIC_InterfacePriorityMask + \param [in] IRQn The Interrupt ID of the SGI. + \param [in] target_list CPUTargetList + \param [in] filter_list TargetListFilter + */ +void GIC_SendSGI(IRQn_Type IRQn, uint32_t target_list, uint32_t filter_list); + +/** \brief API call to initialise the interrupt distributor + + API call to initialise the interrupt distributor + + */ +void GIC_DistInit(void); + +/** \brief API call to initialise the CPU interface + + API call to initialise the CPU interface + + */ +void GIC_CPUInterfaceInit(void); + +/** \brief API call to set the Interrupt Configuration Registers + + API call to initialise the Interrupt Configuration Registers + + */ +void GIC_SetICDICFR (const uint32_t *ICDICFRn); + +/** \brief API call to Enable the GIC + + API call to Enable the GIC + + */ +void GIC_Enable(void); + +#endif /* GIC_H_ */ diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..a32037a6 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,373 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include "timer.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + +/* Define main entry point. */ + +int main() +{ + + /* Setup the timer. */ + timer_init(); + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +UINT status; +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + status = tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat new file mode 100644 index 00000000..926647b2 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/sample_threadx.scat @@ -0,0 +1,39 @@ +;************************************************** +; Copyright (c) 2017 ARM Ltd. All rights reserved. +;************************************************** + +; Scatter-file for RTX Example on Versatile Express R4 + +; This scatter-file places application code, data and peripherals at suitable addresses in the memory map. + +; This platform has 2GB SDRAM starting at 0x0. + + +SDRAM 0x0 0x40000000 +{ + CODE +0 0x200000 + { + startup.o (Vectors, +FIRST) ; Vector table and other (assembler) startup code + * (InRoot$$Sections) ; All (library) code that must be in a root region + * (+RO-CODE) ; Application RO code (.text) + * (+RO-DATA) ; Application RO data (.constdata) + } + + IRQ_STACK +0 ALIGN 8 EMPTY 1024 {} + + FIQ_STACK +0 ALIGN 8 EMPTY 512 {} + + SVC_STACK +0 ALIGN 8 EMPTY 2048 {} + + SYS_STACK +0 ALIGN 8 EMPTY 2048 {} + + ABORT_STACK +0 ALIGN 8 EMPTY 2048 {} + + ; Application RW & ZI data (.data & .bss) + DATA +0 0x100000 + { + * (+RW,+ZI) + } + + PERIPHERALS 0xA0000000 EMPTY 0x20000000 { }; Peripherals +} diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/startup.S b/ports/cortex_r4/ac6/example_build/sample_threadx/startup.S new file mode 100644 index 00000000..98d3b2b1 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/startup.S @@ -0,0 +1,249 @@ +//---------------------------------------------------------------- +// Cortex-R4(F) Embedded example - Startup Code +// +// Copyright (c) 2006-2018 Arm Limited (or its affiliates). All rights reserved. +// Use, modification and redistribution of this file is subject to your possession of a +// valid End User License Agreement for the Arm Product of which these examples are part of +// and your compliance with all applicable terms and conditions of such licence agreement. +//---------------------------------------------------------------- + + +#define FIQ_MODE 0x11 +#define IRQ_MODE 0x12 +#define SVC_MODE 0x13 +#define ABT_MODE 0x17 +#define SYS_MODE 0x1F + +//---------------------------------------------------------------- + + .eabi_attribute Tag_ABI_align8_preserved,1 + + .section VECTORS,"ax" + .align 3 + .cfi_sections .debug_frame // put stack frame info into .debug_frame instead of .eh_frame + +//---------------------------------------------------------------- +// Exception Vector Table +//---------------------------------------------------------------- +// Note: LDR PC instructions are used here, though branch (B) instructions +// could also be used, unless the exception handlers are >32MB away. + + .global Vectors + +Vectors: + LDR PC, Reset_Addr + LDR pc,=__tx_undefined // Undefined handler + LDR pc,=__tx_swi_interrupt // Software interrupt handler + LDR pc,=__tx_prefetch_handler // Prefetch exception handler + LDR pc,=__tx_abort_handler // Abort exception handler + LDR pc,=__tx_reserved_handler // Reserved exception handler + LDR pc,=__tx_irq_handler // IRQ interrupt handler + LDR pc,=__tx_fiq_handler // FIQ interrupt handler + + + .balign 4 +Reset_Addr: .word Reset_Handler +Undefined_Addr: .word __tx_undefined +SVC_Addr: .word __tx_swi_interrupt +Prefetch_Addr: .word __tx_prefetch_handler +Abort_Addr: .word __tx_abort_handler +IRQ_Addr: .word __tx_irq_handler +FIQ_Addr: .word __tx_fiq_handler + + +//---------------------------------------------------------------- +// Reset Handler +//---------------------------------------------------------------- + + .global Reset_Handler + .type Reset_Handler, "function" +Reset_Handler: + +//---------------------------------------------------------------- +// Disable MPU and caches +//---------------------------------------------------------------- + +// Disable MPU and cache in case it was left enabled from an earlier run +// This does not need to be done from a cold reset + + MRC p15, 0, r0, c1, c0, 0 // Read System Control Register + BIC r0, r0, #(0x1 << 12) // Clear I bit 12 to disable I Cache + BIC r0, r0, #(0x1 << 2) // Clear C bit 2 to disable D Cache + BIC r0, r0, #0x1 // Clear M bit 0 to disable MPU + DSB // Ensure all previous loads/stores have completed + MCR p15, 0, r0, c1, c0, 0 // Write System Control Register + ISB // Ensure subsequent insts execute wrt new MPU settings + +//---------------------------------------------------------------- +// Disable Branch prediction +//---------------------------------------------------------------- + +// In the Cortex-R4, the Z-bit of the SCTLR does not control the program flow prediction. +// Some control bits in the ACTLR control the program flow and prefetch features instead. +// These are enabled by default, but are shown here for completeness. + + MRC p15, 0, r0, c1, c0, 1 // Read ACTLR + ORR r0, r0, #(0x1 << 17) // Enable RSDIS bit 17 to disable the return stack + ORR r0, r0, #(0x1 << 16) // Clear BP bit 15 and set BP bit 16: + BIC r0, r0, #(0x1 << 15) // Branch always not taken and history table updates disabled + MCR p15, 0, r0, c1, c0, 1 // Write ACTLR + ISB + +//---------------------------------------------------------------- +// Cache invalidation +//---------------------------------------------------------------- + + DSB // Complete all outstanding explicit memory operations + + MOV r0, #0 + + MCR p15, 0, r0, c7, c5, 0 // Invalidate entire instruction cache + MCR p15, 0, r0, c15, c5, 0 // Invalidate entire data cache + + +//---------------------------------------------------------------- +// Initialize Supervisor Mode Stack using Linker symbol from scatter file. +// Stacks must be 8 byte aligned. +//---------------------------------------------------------------- + + /****** NOTE ****** We must be in SVC MODE at this point. Some monitors + enter this routine in USER mode and require a software interrupt to + change into SVC mode. */ + +#ifdef TX_ENABLE_IRQ_NESTING + /* Setup the system mode stack for nested interrupt support */ + MOV r3, #SYS_MODE // Build SYS mode CPSR + MSR CPSR_c, r3 // Enter SYS mode + LDR sp, =Image$$SYS_STACK$$ZI$$Limit // Setup SYS stack pointer +#endif + + CPS #ABT_MODE // Build Abort mode CPSR + LDR sp, =Image$$ABORT_STACK$$ZI$$Limit // Setup abort stack pointer + + CPS #FIQ_MODE // Build FIQ mode CPSR + LDR sp, =Image$$FIQ_STACK$$ZI$$Limit // Setup FIQ stack pointer + MOV sl, #0 // Clear sl + MOV fp, #0 // Clear fp + + CPS #IRQ_MODE // Build IRQ mode CPSR + LDR sp, =Image$$IRQ_STACK$$ZI$$Limit // Setup IRQ stack pointer + + CPS #SVC_MODE // Build SVC mode CPSR + LDR sp, =Image$$SVC_STACK$$ZI$$Limit // Setup SVC stack pointer + + +//---------------------------------------------------------------- +// TCM Configuration +//---------------------------------------------------------------- + +// Cortex-R4 optionally provides two Tightly-Coupled Memory (TCM) blocks (ATCM and BTCM) for fast access to code or data. +// ATCM typically holds interrupt or exception code that must be accessed at high speed, +// without any potential delay resulting from a cache miss. +// BTCM typically holds a block of data for intensive processing, such as audio or video data. +// In the Cortex-R4 processor, both ATCM and BTCM support both instruction and data accesses. + +// The following illustrates basic TCM configuration, as the basis for exploration by the user + +#ifdef TCM + .global Image$$ATCM$$Base + .global Image$$BTCM0$$Base + .global Image$$BTCM1$$Base + + MRC p15, 0, r0, c0, c0, 2 // Read TCM Type Register + // r0 now contains ATCM & BTCM availability + + MRC p15, 0, r0, c9, c1, 1 // Read ATCM Region Register + // r0 now contains ATCM size in bits [6:2] + + MRC p15, 0, r0, c9, c1, 0 // Read BTCM Region Register + // r0 now contains BTCM size in bits [6:2] + +// The Cortex-R4F Core Tile has +// 64K ATCM from 0xE0FD0000 to 0xE0FDFFFF +// 64K BTCM0 from 0xE0FE0000 to 0xE0FEFFFF +// 64K BTCM1 from 0xE0FF0000 to 0xE0FFFFFF + + LDR r0, =Image$$ATCM$$Base // Set ATCM base address + ORR r0, r0, #1 // Enable it + MCR p15, 0, r0, c9, c1, 1 // Write ATCM Region Register + + LDR r0, =Image$$BTCM0$$Base // Set BTCM base address + ORR r0, r0, #1 // Enable it + MCR p15, 0, r0, c9, c1, 0 // Write BTCM Region Register + +#endif + +#ifdef __ARM_FP +//---------------------------------------------------------------- +// Enable access to VFP by enabling access to Coprocessors 10 and 11. +// Enables Full Access i.e. in both privileged and non privileged modes +//---------------------------------------------------------------- + + MRC p15, 0, r0, c1, c0, 2 // Read Coprocessor Access Control Register (CPACR) + ORR r0, r0, #(0xF << 20) // Enable access to CP 10 & 11 + MCR p15, 0, r0, c1, c0, 2 // Write Coprocessor Access Control Register (CPACR) + ISB + +//---------------------------------------------------------------- +// Switch on the VFP hardware +//---------------------------------------------------------------- + + MOV r0, #0x40000000 + VMSR FPEXC, r0 // Write FPEXC register, EN bit set +#endif + +//---------------------------------------------------------------- +// Enable Branch prediction +//---------------------------------------------------------------- + +// In the Cortex-R4, the Z-bit of the SCTLR does not control the program flow prediction. +// Some control bits in the ACTLR control the program flow and prefetch features instead. +// These are enabled by default, but are shown here for completeness. + + MRC p15, 0, r0, c1, c0, 1 // Read ACTLR + BIC r0, r0, #(0x1 << 17) // Clear RSDIS bit 17 to enable return stack + BIC r0, r0, #(0x1 << 16) // Clear BP bit 15 and BP bit 16: + BIC r0, r0, #(0x1 << 15) // Normal operation, BP is taken from the global history table. + MCR p15, 0, r0, c1, c0, 1 // Write ACTLR + ISB + + + /* Enable the GIC. */ + BL GIC_Enable + + .global __main + B __main + + .size Reset_Handler, . - Reset_Handler + +//---------------------------------------------------------------- +// Global Enable for Instruction and Data Caching +//---------------------------------------------------------------- + + .global enable_caches + + .type enable_caches, "function" + .cfi_startproc +enable_caches: + + MRC p15, 0, r0, c1, c0, 0 // Read System Control Register + ORR r0, r0, #(0x1 << 12) // enable I Cache + ORR r0, r0, #(0x1 << 2) // enable D Cache + MCR p15, 0, r0, c1, c0, 0 // Write System Control Register + ISB + + BX lr + .cfi_endproc + + .size enable_caches, . - enable_caches + +/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This + routine will set the initial stack to use the ThreadX IRQ & FIQ & + (optionally SYS) stack areas. */ + + .global __user_initial_stackheap + .type __user_initial_stackheap, %function +__user_initial_stackheap: + + LDR r1, =Image$$SVC_STACK$$ZI$$Limit + BX lr // Return to caller diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/timer.c b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.c new file mode 100644 index 00000000..e964d0f6 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.c @@ -0,0 +1,28 @@ +#include "gic.h" + +/* Systick registers */ +#define PRIVTIM_IRQ 34 +#define PRIVATE_TIMER_BASE (0xB0110000) +#define PRIVTIM_RELOAD (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0x0))) +#define PRIVTIM_CURRENT (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0x4))) +#define PRIVTIM_CTRL (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0x8))) +#define PRIVTIM_STATUS (*((volatile uint32_t *)(PRIVATE_TIMER_BASE + 0xc))) + +#define OS_CLOCK 12000000 +#define OS_TICK 1000 +#define OS_TRV ((uint32_t)(((double)OS_CLOCK*(double)OS_TICK)/1E6)-1) + +#define U32 uint32_t +#define GICD_ICDICER0 (*((volatile U32 *)(GICDistributor_BASE + 0x180))) /* - RW - Interrupt Clear-Enable Registers */ +#define GICD_ICDISER0 (*((volatile U32 *)(GICDistributor_BASE + 0x100))) /* - RW - Interrupt Set-Enable Registers */ +#define GICD_ICDIPR0 (*((volatile U32 *)(GICDistributor_BASE + 0x400))) /* - RW - Interrupt Priority Registers */ +#define GICD_ICDSGIR (*((volatile U32 *)(GICDistributor_BASE + 0xf00))) /* - RW - Interrupt Software Interrupt Register */ +#define GICD_ICDICERx(irq) *(volatile U32 *)(&GICD_ICDICER0 + irq/32) +#define GICD_ICDISERx(irq) *(volatile U32 *)(&GICD_ICDISER0 + irq/32) + +void timer_init() +{ + GIC_EnableIRQ(34); + PRIVTIM_RELOAD = 0x200; + PRIVTIM_CTRL |= 0xC0; /* Enable timer, periodic mode */ +} diff --git a/ports/cortex_r4/ac6/example_build/sample_threadx/timer.h b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.h new file mode 100644 index 00000000..efab1fe1 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/sample_threadx/timer.h @@ -0,0 +1,4 @@ +#ifndef TIMER_H +#define TIMER_H +void timer_init(); +#endif diff --git a/ports/cortex_r4/ac6/example_build/tx/.cproject b/ports/cortex_r4/ac6/example_build/tx/.cproject new file mode 100644 index 00000000..fed5c2d2 --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/tx/.cproject @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/example_build/tx/.project b/ports/cortex_r4/ac6/example_build/tx/.project new file mode 100644 index 00000000..161d4e8f --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/tx/.project @@ -0,0 +1,48 @@ + + + tx + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + inc_common + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/inc + + + inc_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/inc + + + src_common + 2 + $%7BPARENT-5-PROJECT_LOC%7D/common/src + + + src_port + 2 + $%7BPARENT-2-PROJECT_LOC%7D/src + + + diff --git a/ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml b/ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml new file mode 100644 index 00000000..b515c43e --- /dev/null +++ b/ports/cortex_r4/ac6/example_build/tx/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/cortex_r4/ac6/inc/tx_port.h b/ports/cortex_r4/ac6/inc/tx_port.h new file mode 100644 index 00000000..5a38b4bf --- /dev/null +++ b/ports/cortex_r4/ac6/inc/tx_port.h @@ -0,0 +1,341 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/AC6 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + +/* Define compiler intrinsics. */ + +#include "arm_compat.h" + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define VFP extension for the Cortex-R4. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/AC6 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + + + + + diff --git a/ports/cortex_r4/ac6/readme_threadx.txt b/ports/cortex_r4/ac6/readme_threadx.txt new file mode 100644 index 00000000..a5849018 --- /dev/null +++ b/ports/cortex_r4/ac6/readme_threadx.txt @@ -0,0 +1,392 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Thumb & 32-bit Mode + + Using ARM Compiler 6 & DS + +1. Import the ThreadX Projects + +In order to build the ThreadX library and the ThreadX demonstration, first move +the project folders into your DS workspace directory. The project folders are +named 'tx' and 'sample_threadx' and are located in the installation directory. + +Now that the projects are in the workspace directory, import them into DS by +doing the following for each project: + + 1. Click 'File -> Import -> Existing Projects into Workspace' + 2. Set the root directory the project i.e. the 'tx' or 'sample_threadx' directory + 3. Click 'Finish' + +Note: the projects were made using DS-5, so DS will prompt you to migrate the projects. +This is expected, so please do so. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply right-click the Eclipse project +"tx" and then select the "Build Project" button. You should now observe the compilation +and assembly of the ThreadX library. This project build produces the ThreadX +library file tx.a. + + +3. Demonstration System + +The ThreadX demonstration is designed to execute under the DS-5 debugger on the +VE_Cortex-R4 Bare Metal simulator. + +Building the demonstration is easy; simply right-click the Eclipse project +"sample_threadx" and then select the "Build Project" button. You should now observe +the compilation and assembly of the ThreadX demonstration. This project build produces +the ThreadX library file sample_threadx.axf. Next, expand the demo ThreadX project folder +in the Project Explorer window, right-click on the 'cortex-r4_tx.launch' file, click +'Debug As', and then click 'cortex-r4_tx' from the submenu. This will cause the +debugger to load the sample_threadx.axf ELF file and run to main. You are now ready +to execute the ThreadX demonstration. + + +4. System Initialization + +The entry point in ThreadX for the Cortex-R4 using ARM tools is at label +"Vectors". This is defined within startup.S in the sample_threadx project. In addition, +this is where all static and global pre-set C variable initialization processing +takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for determining the +first available RAM address for use by the application, which is supplied as the +sole input parameter to your application definition function, tx_application_define. + + +5. Register Usage and Stack Frames + +The ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup.S +file contains the vectors and is loaded at address zero. On actual hardware platforms, +this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + .global __tx_irq_handler + .type __tx_irq_handler, %function +__tx_irq_handler: + + /* Jump to context save to save system context. */ + B _tx_thread_context_save + + ... + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + /* Application IRQ handlers can be called here! */ + + ... + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + +7.2.2 Vectored IRQ ISRs + +The vectored ARM ISR mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example ISR handler defined in +tx_initialize_low_level.s: + + .global __tx_example_vectored_irq_handler + .type __tx_example_vectored_irq_handler, %function +__tx_example_vectored_irq_handler: + + + /* Save initial context and call context save to prepare for + vectored ISR execution. */ + + STMDB sp!, {r0-r3} // Save some scratch registers + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other scratch registers + BL _tx_thread_vectored_context_save // Vectored context save + + ... + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + /* Application IRQ handlers can be called here! */ + + ... + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .type __tx_irq_handler, %function + .global __tx_irq_processing_return + .type __tx_irq_processing_return, %function +__tx_irq_handler: + + /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: + + ... + + /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start + from IRQ mode with interrupts disabled. This routine switches to the + system mode and returns with IRQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all IRQ interrupts are cleared + prior to enabling nested IRQ interrupts. */ + BL _tx_thread_irq_nesting_start + + /* Application IRQ handlers can be called here! */ + + ... + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_context_restore. + This routine returns in processing in IRQ mode with interrupts disabled. */ + BL _tx_thread_irq_nesting_end + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R4 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + .global __tx_fiq_handler + .type __tx_fiq_handler, %function + .global __tx_fiq_processing_return + .type __tx_fiq_processing_return, %function +__tx_fiq_handler: + + /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: + + /* At this point execution is still in the FIQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. */ + + /* Application FIQ handlers can be called here! */ + + /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .type __tx_fiq_handler, %function + .global __tx_fiq_processing_return + .type __tx_fiq_processing_return, %function +__tx_fiq_handler: + + /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: + + /* At this point execution is still in the FIQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. */ + + /* Enable nested FIQ interrupts. NOTE: Since this service returns + with FIQ interrupts enabled, all FIQ interrupt sources must be + cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start + + /* Application FIQ handlers can be called here! */ + + /* Disable nested FIQ interrupts. The mode is switched back to + FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end + + /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-R4 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R4 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. To build ThreadX +assembly files in Thumb mode, define TX_THUMB_MODE. + + +10. VFP Support + +By default, VFP support is disabled for each thread. If saving the context of the VFP registers +is needed, the following API call must be made from the context of the application thread - before +the VFP usage: + +void tx_thread_vfp_enable(void); + +After this API is called in the application, VFP registers will be saved/restored for this thread if it +is preempted via an interrupt. All other suspension of the this thread will not require the VFP registers +to be saved/restored. + +To disable VFP register context saving, simply call the following API: + +void tx_thread_vfp_disable(void); + +Note that if VFP registers are used in ISRs, the save/restore of VFP registers must be done by the ISR. +In addition, the startup code is responsible for enabling VFP usage. + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R4 using ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/ac6/src/tx_initialize_low_level.S b/ports/cortex_r4/ac6/src/tx_initialize_low_level.S new file mode 100644 index 00000000..e1995158 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_initialize_low_level.S @@ -0,0 +1,326 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + + +#define GICI_BASE 0xAE000000 +#define ICCIAR_OFFSET 0x0000000C +#define ICCEOIR_OFFSET 0x00000010 + + + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore +#ifdef TX_ENABLE_FIQ_SUPPORT + .global _tx_thread_fiq_context_save + .global _tx_thread_fiq_context_restore +#endif +#ifdef TX_ENABLE_IRQ_NESTING + .global _tx_thread_irq_nesting_start + .global _tx_thread_irq_nesting_end +#endif +#ifdef TX_ENABLE_FIQ_NESTING + .global _tx_thread_fiq_nesting_start + .global _tx_thread_fiq_nesting_end +#endif + .global _tx_timer_interrupt + .global __main + .global _tx_version_id + .global _tx_build_options + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_initialize_low_level(VOID) +{ */ + .global _tx_initialize_low_level + .type _tx_initialize_low_level, "function" +_tx_initialize_low_level: + + /* Save the system stack pointer. */ + /* _tx_thread_system_stack_ptr = (VOID_PTR) (sp); */ + + LDR r0, =Image$$SVC_STACK$$ZI$$Limit + LDR r1, =_tx_thread_system_stack_ptr // Pickup address of system stack ptr + STR r0, [r1] // Pickup system stack + + /* Save the first available memory address. */ + /* _tx_initialize_unused_memory = (VOID_PTR) Image$$ZI$$Limit + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; */ + + LDR r0, =Image$$DATA$$ZI$$Limit + LDR r2, =_tx_initialize_unused_memory // Pickup unused memory ptr address + STR r0, [r2, #0] // Save first free memory address + + /* Return to caller. */ + BX lr // Return to caller +/* } */ + + /* Define shells for each of the interrupt vectors. */ + + .global __tx_undefined + .type __tx_undefined, "function" +__tx_undefined: + B __tx_undefined // Undefined handler + + .global __tx_swi_interrupt + .type __tx_swi_interrupt, "function" +__tx_swi_interrupt: + B __tx_swi_interrupt // Software interrupt handler + + .global __tx_prefetch_handler + .type __tx_prefetch_handler, "function" +__tx_prefetch_handler: + B __tx_prefetch_handler // Prefetch exception handler + + .global __tx_abort_handler + .type __tx_abort_handler, "function" +__tx_abort_handler: + B __tx_abort_handler // Abort exception handler + + .global __tx_reserved_handler + .type __tx_reserved_handler, "function" +__tx_reserved_handler: + B __tx_reserved_handler // Reserved exception handler + + + .global __tx_irq_handler + .type __tx_irq_handler, "function" + .global __tx_irq_processing_return + .type __tx_irq_processing_return, "function" +__tx_irq_handler: + + /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: + + /* Acknowledge the interrupt. */ + LDR r1, =GICI_BASE // Load the base of the GIC + LDR r0, [r1, #ICCIAR_OFFSET] // Read ICCIAR (GIC CPU Interface register) + DSB // Ensure that interrupt acknowledge completes before re-enabling interrupts + PUSH {r0, r1} // Save the IRQ ID and the GIC base address on the stack + + /* Clear the timer interrupt. */ + LDR r0, =0xB0110000 // Load the base address of the timer + MOV r1, #1 // Setup value to write to the interrupt clear register - can be anything. + STR r1, [r0, #0x0C] // Clear the interrupt. 0x0C is the offset to the interrupt clear register. + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + + BL _tx_timer_interrupt // Timer interrupt handler +_tx_not_timer_interrupt: + + /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start + from IRQ mode with interrupts disabled. This routine switches to the + system mode and returns with IRQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all IRQ interrupts are cleared + prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif + + + /* Application IRQ handlers can be called here! */ + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_context_restore. + This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif + + POP {r0, r1} // Restore the IRQ ID and GIC base address + STR r0, [r1, #ICCEOIR_OFFSET] // Write the IRQ ID to the End Of Interrupt register to clear the active bit + + /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + + /* This is an example of a vectored IRQ handler. */ + + .global __tx_example_vectored_irq_handler + .type __tx_example_vectored_irq_handler, "function" +__tx_example_vectored_irq_handler: + + + /* Save initial context and call context save to prepare for + vectored ISR execution. */ + +/* + STMDB sp!, {r0-r3} // Save some scratch registers + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other scratch registers + BL _tx_thread_vectored_context_save // Vectored context save +*/ + + /* At this point execution is still in the IRQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. In + addition, IRQ interrupts may be re-enabled - with certain restrictions - + if nested IRQ interrupts are desired. Interrupts may be re-enabled over + small code sequences where lr is saved before enabling interrupts and + restored after interrupts are again disabled. */ + + + /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start + from IRQ mode with interrupts disabled. This routine switches to the + system mode and returns with IRQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all IRQ interrupts are cleared + prior to enabling nested IRQ interrupts. */ +/* +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +*/ + + /* Application IRQ handlers can be called here! */ + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_context_restore. + This routine returns in processing in IRQ mode with interrupts disabled. */ +/* +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +*/ + + /* Jump to context restore to restore system context. */ +/* + B _tx_thread_context_restore +*/ + + +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .type __tx_fiq_handler, "function" +__tx_fiq_handler: + + /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save + + .global __tx_fiq_processing_return + .type __tx_fiq_processing_return, "function" +__tx_fiq_processing_return: + + /* At this point execution is still in the FIQ mode. The CPSR, point of + interrupt, and all C scratch registers are available for use. */ + + /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start + from FIQ mode with interrupts disabled. This routine switches to the + system mode and returns with FIQ interrupts enabled. */ + + /* NOTE: It is very important to ensure all FIQ interrupts are cleared + prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif + + /* Application FIQ handlers can be called here! */ + + /* If interrupt nesting was started earlier, the end of interrupt nesting + service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif + + /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +#else + .global __tx_fiq_handler + .type __tx_fiq_handler, "function" +__tx_fiq_handler: + B __tx_fiq_handler // FIQ interrupt handler +#endif + + /* Reference build options and version ID to ensure they come in. */ + + LDR r2, =_tx_build_options // Pickup build options variable address + LDR r0, [r2, #0] // Pickup build options content + LDR r2, =_tx_version_id // Pickup version ID variable address + LDR r0, [r2, #0] // Pickup version ID content diff --git a/ports/cortex_r4/ac6/src/tx_thread_context_restore.S b/ports/cortex_r4/ac6/src/tx_thread_context_restore.S new file mode 100644 index 00000000..eefbe092 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_context_restore.S @@ -0,0 +1,252 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +*/ + + +#define IRQ_MODE 0x12 // IRQ mode +#define SVC_MODE 0x13 // SVC mode + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_exit +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling routine */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_restore(VOID) +{ */ + .global _tx_thread_context_restore + .type _tx_thread_context_restore, "function" +_tx_thread_context_restore: + + /* Lockout interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR exit function to indicate an ISR is complete. */ + + BL _tx_execution_isr_exit // Call the ISR exit function +#endif + + /* Determine if interrupts are nested. */ + /* if (--_tx_thread_system_state) + { */ + + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3, #0] // Pickup system state + SUB r2, r2, #1 // Decrement the counter + STR r2, [r3, #0] // Store the counter + CMP r2, #0 // Was this the first interrupt? + BEQ __tx_thread_not_nested_restore // If so, not a nested restore + + /* Interrupts are nested. */ + + /* Just recover the saved registers and return to the point of + interrupt. */ + + LDMIA sp!, {r0, r10, r12, lr} // Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + /* } */ +__tx_thread_not_nested_restore: + + /* Determine if a thread was interrupted and no preemption is required. */ + /* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) + (_tx_thread_preempt_disable)) + { */ + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup actual current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_restore // Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable // Pickup preempt disable address + LDR r2, [r3, #0] // Pickup actual preempt disable flag + CMP r2, #0 // Is it set? + BNE __tx_thread_no_preempt_restore // Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr // Pickup address of execute thread ptr + LDR r2, [r3, #0] // Pickup actual execute thread pointer + CMP r0, r2 // Is the same thread highest priority? + BNE __tx_thread_preempt_restore // No, preemption needs to happen + + +__tx_thread_no_preempt_restore: + + /* Restore interrupted thread or ISR. */ + + /* Pickup the saved stack pointer. */ + /* tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; */ + + /* Recover the saved context and return to the point of interrupt. */ + + LDMIA sp!, {r0, r10, r12, lr} // Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + /* } + else + { */ +__tx_thread_preempt_restore: + + LDMIA sp!, {r3, r10, r12, lr} // Recover temporarily saved registers + MOV r1, lr // Save lr (point of interrupt) + + CPS #SVC_MODE // Switch to SVC mode to save context on thread stack + STR r1, [sp, #-4]! // Save point of interrupt + STMDB sp!, {r4-r12, lr} // Save upper half of registers + MOV r4, r3 // Save SPSR in r4 + + CPS #IRQ_MODE // Switch back to IRQ mode + LDMIA sp!, {r0-r3} // Recover r0-r3 + + CPS #SVC_MODE // Switch to SVC mode to save remaining context on thread stack + STMDB sp!, {r0-r3} // Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup current thread pointer + +#ifdef __ARM_FP + LDR r2, [r0, #144] // Pickup the VFP enabled flag + CMP r2, #0 // Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save // No, skip VFP IRQ save + VMRS r2, FPSCR // Pickup the FPSCR + STR r2, [sp, #-4]! // Save FPSCR + VSTMDB sp!, {D0-D15} // Save D0-D15 +_tx_skip_irq_vfp_save: +#endif + + MOV r3, #1 // Build interrupt stack type + STMDB sp!, {r3, r4} // Save interrupt stack type and SPSR + STR sp, [r0, #8] // Save stack pointer in thread control + // block + + /* Save the remaining time-slice and disable it. */ + /* if (_tx_timer_time_slice) + { */ + + LDR r3, =_tx_timer_time_slice // Pickup time-slice variable address + LDR r2, [r3, #0] // Pickup time-slice + CMP r2, #0 // Is it active? + BEQ __tx_thread_dont_save_ts // No, don't save it + + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; */ + /* _tx_timer_time_slice = 0; */ + + STR r2, [r0, #24] // Save thread's time-slice + MOV r2, #0 // Clear value + STR r2, [r3, #0] // Disable global time-slice flag + + /* } */ +__tx_thread_dont_save_ts: + + + /* Clear the current task pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + MOV r0, #0 // NULL value + STR r0, [r1, #0] // Clear current thread pointer + + /* Return to the scheduler. */ + /* _tx_thread_schedule(); */ + + B _tx_thread_schedule // Return to scheduler + /* } */ + +__tx_thread_idle_system_restore: + + /* Just return back to the scheduler! */ + CPS #SVC_MODE // Switch to SVC mode + B _tx_thread_schedule // Return to scheduler +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_context_save.S b/ports/cortex_r4/ac6/src/tx_thread_context_save.S new file mode 100644 index 00000000..9f5e23db --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_context_save.S @@ -0,0 +1,202 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_irq_processing_return +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_enter +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_context_save(VOID) +{ */ + .global _tx_thread_context_save + .type _tx_thread_context_save, "function" +_tx_thread_context_save: + + /* Upon entry to this routine, it is assumed that IRQ interrupts are locked + out, we are in IRQ mode, and all registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) + { */ + + STMDB sp!, {r0-r3} // Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3, #0] // Pickup system state + CMP r2, #0 // Is this the first interrupt? + BEQ __tx_thread_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + + /* Save the rest of the scratch registers on the stack and return to the + calling ISR. */ + + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other registers + + /* Return to the ISR. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_irq_processing_return // Continue IRQ processing + +__tx_thread_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) + { */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Save minimal context of interrupted thread. */ + + MRS r2, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} // Store other registers + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_irq_processing_return // Continue IRQ processing + + /* } + else + { */ + +__tx_thread_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + + /* Not much to do here, just adjust the stack pointer, and return to IRQ + processing. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + ADD sp, sp, #16 // Recover saved registers + B __tx_irq_processing_return // Continue IRQ processing + + /* } */ +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..8d26087f --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,260 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ +/* #include "tx_timer.h" */ + + +#define FIQ_MODE 0x11 // FIQ mode +#define SVC_MODE 0x13 // SVC mode +#define MODE_MASK 0x1F // Mode mask +#define IRQ_MODE_BITS 0x12 // IRQ mode bits + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_exit +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_context_restore Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the fiq interrupt context when processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling routine */ +/* */ +/* CALLED BY */ +/* */ +/* FIQ ISR Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_fiq_context_restore(VOID) */ +/* { */ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore, "function" +_tx_thread_fiq_context_restore: + + /* Lockout interrupts. */ + + CPSID if // Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR exit function to indicate an ISR is complete. */ + + BL _tx_execution_isr_exit // Call the ISR exit function +#endif + + /* Determine if interrupts are nested. */ + /* if (--_tx_thread_system_state) */ + /* { */ + + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3] // Pickup system state + SUB r2, r2, #1 // Decrement the counter + STR r2, [r3] // Store the counter + CMP r2, #0 // Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore // If so, not a nested restore + + /* Interrupts are nested. */ + + /* Just recover the saved registers and return to the point of + interrupt. */ + + LDMIA sp!, {r0, r10, r12, lr} // Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + + /* } */ +__tx_thread_fiq_not_nested_restore: + + /* Determine if a thread was interrupted and no preemption is required. */ + /* else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) */ + /* (_tx_thread_preempt_disable)) */ + /* { */ + + LDR r1, [sp] // Pickup the saved SPSR + MOV r2, #MODE_MASK // Build mask to isolate the interrupted mode + AND r1, r1, r2 // Isolate mode bits + CMP r1, #IRQ_MODE_BITS // Was an interrupt taken in IRQ mode before we + // got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore // Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1] // Pickup actual current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore // Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable // Pickup preempt disable address + LDR r2, [r3] // Pickup actual preempt disable flag + CMP r2, #0 // Is it set? + BNE __tx_thread_fiq_no_preempt_restore // Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr // Pickup address of execute thread ptr + LDR r2, [r3] // Pickup actual execute thread pointer + CMP r0, r2 // Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore // No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: + + /* Restore interrupted thread or ISR. */ + + /* Pickup the saved stack pointer. */ + /* tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; */ + + /* Recover the saved context and return to the point of interrupt. */ + + LDMIA sp!, {r0, lr} // Recover SPSR and POI + MSR SPSR_cxsf, r0 // Put SPSR back + LDMIA sp!, {r0-r3} // Recover r0-r3 + SUBS pc, lr, #0 // Return to point of interrupt + + /* } */ + /* else */ + /* { */ +__tx_thread_fiq_preempt_restore: + + LDMIA sp!, {r3, lr} // Recover temporarily saved registers + MOV r1, lr // Save lr (point of interrupt) + + CPS #SVC_MODE // Switch to SVC mode to save context on thread stack + STR r1, [sp, #-4]! // Save point of interrupt + STMDB sp!, {r4-r12, lr} // Save upper half of registers + MOV r4, r3 // Save SPSR in r4 + + CPS #FIQ_MODE // Switch back to FIQ mode + LDMIA sp!, {r0-r3} // Recover r0-r3 + + CPS #SVC_MODE // Switch to SVC mode to save remaining context on thread stack + STMDB sp!, {r0-r3} // Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1] // Pickup current thread pointer + +#ifdef __ARM_FP + LDR r2, [r0, #144] // Pickup the VFP enabled flag + CMP r2, #0 // Is the VFP enabled? + BEQ _tx_skip_fiq_vfp_save // No, skip VFP FIQ save + VMRS r2, FPSCR // Pickup the FPSCR + STR r2, [sp, #-4]! // Save FPSCR + VSTMDB sp!, {D0-D15} // Save D0-D15 +_tx_skip_fiq_vfp_save: +#endif + + MOV r3, #1 // Build interrupt stack type + STMDB sp!, {r3, r4} // Save interrupt stack type and SPSR + STR sp, [r0, #8] // Save stack pointer in thread control + // block + + /* Save the remaining time-slice and disable it. */ + /* if (_tx_timer_time_slice) */ + /* { */ + + LDR r3, =_tx_timer_time_slice // Pickup time-slice variable address + LDR r2, [r3] // Pickup time-slice + CMP r2, #0 // Is it active? + BEQ __tx_thread_fiq_dont_save_ts // No, don't save it + + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; */ + /* _tx_timer_time_slice = 0; */ + + STR r2, [r0, #24] // Save thread's time-slice + MOV r2, #0 // Clear value + STR r2, [r3] // Disable global time-slice flag + + /* } */ +__tx_thread_fiq_dont_save_ts: + + + /* Clear the current task pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + MOV r0, #0 // NULL value + STR r0, [r1] // Clear current thread pointer + + /* Return to the scheduler. */ + /* _tx_thread_schedule(); */ + + B _tx_thread_schedule // Return to scheduler + /* } */ + +__tx_thread_fiq_idle_system_restore: + + /* Just return back to the scheduler! */ + + ADD sp, sp, #24 // Recover FIQ stack space + CPS #SVC_MODE // Switch to SVC mode + B _tx_thread_schedule // Return to scheduler + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..3221a358 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_context_save.S @@ -0,0 +1,209 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_enter +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_context_save Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + /* VOID _tx_thread_fiq_context_save(VOID) */ +/* { */ + + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save, "function" +_tx_thread_fiq_context_save: + + /* Upon entry to this routine, it is assumed that IRQ interrupts are locked + out, we are in IRQ mode, and all registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) */ + /* { */ + + STMDB sp!, {r0-r3} // Save some working registers + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3] // Pickup system state + CMP r2, #0 // Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3] // Store it back in the variable + + /* Save the rest of the scratch registers on the stack and return to the + calling ISR. */ + + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} // Store other registers + + /* Return to the ISR. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_fiq_processing_return // Continue FIQ processing + +__tx_thread_fiq_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) */ + /* { */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3] // Store it back in the variable + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1] // Pickup current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_fiq_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Save minimal context of interrupted thread. */ + + MRS r2, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r2, lr} // Store other registers, Note that we don't + // need to save sl and ip since FIQ has + // copies of these registers. Nested + // interrupt processing does need to save + // these registers. + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + B __tx_fiq_processing_return // Continue FIQ processing + + /* } */ + /* else */ + /* { */ + +__tx_thread_fiq_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + /* Not much to do here, save the current SPSR and LR for possible + use in IRQ interrupted in idle system conditions, and return to + FIQ interrupt processing. */ + + MRS r0, SPSR // Pickup saved SPSR + SUB lr, lr, #4 // Adjust point of interrupt + STMDB sp!, {r0, lr} // Store other registers that will get used + // or stripped off the stack in context + // restore + B __tx_fiq_processing_return // Continue FIQ processing + + /* } */ +/* } */ + +#endif diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..8568b961 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,108 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define FIQ_MODE 0x11 // FIQ Mode bits + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_nesting_end Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from FIQ mode after */ +/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +/* processing from system mode back to FIQ mode prior to the ISR */ +/* calling _tx_thread_fiq_context_restore. Note that this function */ +/* assumes the system stack pointer is in the same position after */ +/* nesting start function was called. */ +/* */ +/* This function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with FIQ interrupts disabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_fiq_nesting_end(VOID) */ +/* { */ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end, "function" +_tx_thread_fiq_nesting_end: + MOV r3, lr // Save ISR return address + + #ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts + #else + CPSID i // Disable IRQ interrupts + #endif + + LDMIA sp!, {r1, lr} // Pickup saved lr (and r1 throw-away for + // 8-byte alignment logic) + CPS #FIQ_MODE // Switch back to FIQ mode + BX r3 // Return to caller +/* } */ + + + diff --git a/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..60bd335f --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,96 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define SYS_MODE 0x12 // System mode + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_fiq_nesting_start Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from FIQ mode after */ +/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +/* processing to the system mode so nested FIQ interrupt processing */ +/* is possible (system mode has its own "lr" register). Note that */ +/* this function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with FIQ interrupts enabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_fiq_nesting_start(VOID) */ +/* { */ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start, "function" +_tx_thread_fiq_nesting_start: + MOV r3, lr // Save ISR return address + CPS #SYS_MODE // Switch to system mode + STMDB sp!, {r1, lr} // Push the system mode lr on the system mode stack + // and push r1 just to keep 8-byte alignment + CPSIE f // Enable FIQ interrupts + BX r3 // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S b/ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..aa0215ac --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_interrupt_control.S @@ -0,0 +1,102 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define INT_MASK 0xC0 // Interrupt bit mask +#else +#define INT_MASK 0x80 // Interrupt bit mask +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_control(UINT new_posture) */ +/* { */ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control, "function" +_tx_thread_interrupt_control: + + /* Pickup current interrupt lockout posture. */ + + MRS r3, CPSR // Pickup current CPSR + BIC r1, r3, #INT_MASK // Clear interrupt lockout bits + ORR r1, r1, r0 // Or-in new interrupt lockout bits + + /* Apply the new interrupt posture. */ + + MSR CPSR_c, r1 // Setup new CPSR + AND r0, r3, #INT_MASK // Return previous interrupt mask + BX lr // Return to caller + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S b/ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..079cbfdc --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_interrupt_disable.S @@ -0,0 +1,96 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_disable Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for disabling interrupts */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_disable(void) */ +/* { */ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable, "function" +_tx_thread_interrupt_disable: + + /* Pickup current interrupt lockout posture. */ + + MRS r0, CPSR // Pickup current CPSR + + /* Mask interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ +#else + CPSID i // Disable IRQ +#endif + + BX lr // Return to caller + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S b/ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..7c374cad --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_interrupt_restore.S @@ -0,0 +1,90 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_restore Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for restoring interrupts to the state */ +/* returned by a previous _tx_thread_interrupt_disable call. */ +/* */ +/* INPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* UINT _tx_thread_interrupt_restore(UINT old_posture) */ +/* { */ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore, "function" +_tx_thread_interrupt_restore: + + /* Apply the new interrupt posture. */ + + MSR CPSR_c, r0 // Setup new CPSR + BX lr // Return to caller +/* } */ + + + diff --git a/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..7f81779a --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,105 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define IRQ_MODE 0x12 // IRQ Mode bits + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_irq_nesting_end Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from IRQ mode after */ +/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +/* processing from system mode back to IRQ mode prior to the ISR */ +/* calling _tx_thread_context_restore. Note that this function */ +/* assumes the system stack pointer is in the same position after */ +/* nesting start function was called. */ +/* */ +/* This function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with IRQ interrupts disabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_irq_nesting_end(VOID) */ +/* { */ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end, "function" +_tx_thread_irq_nesting_end: + MOV r3, lr // Save ISR return address + + #ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts + #else + CPSID i // Disable IRQ interrupts + #endif + + LDMIA sp!, {r1, lr} // Pickup saved lr (and r1 throw-away for + // 8-byte alignment logic) + CPS #IRQ_MODE // Switch back to IRQ mode + BX r3 // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..c8cd19a5 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,96 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + +#define SYS_MODE 0x1F // System mode bits + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_irq_nesting_start Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is called by the application from IRQ mode after */ +/* _tx_thread_context_save has been called and switches the IRQ */ +/* processing to the system mode so nested IRQ interrupt processing */ +/* is possible (system mode has its own "lr" register). Note that */ +/* this function assumes that the system mode stack pointer was setup */ +/* during low-level initialization (tx_initialize_low_level.s). */ +/* */ +/* This function returns with IRQ interrupts enabled. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_irq_nesting_start(VOID) */ +/* { */ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start, "function" +_tx_thread_irq_nesting_start: + MOV r3, lr // Save ISR return address + CPS #SYS_MODE // Switch to System Mode + STMDB sp!, {r1, lr} // Push the system mode lr on the system mode stack + // and push r1 just to keep 8-byte alignment + CPSIE i // Enable IRQ interrupts + BX r3 // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_schedule.S b/ports/cortex_r4/ac6/src/tx_thread_schedule.S new file mode 100644 index 00000000..75d29128 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_schedule.S @@ -0,0 +1,230 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ +/* #include "tx_timer.h" */ + + + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_thread_enter +#endif + + .arm + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* _tx_thread_system_return Return to system from thread */ +/* _tx_thread_context_restore Restore thread's context */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_schedule(VOID) */ +/* { */ + .global _tx_thread_schedule + .type _tx_thread_schedule, "function" +_tx_thread_schedule: + + /* Enable interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if // Enable IRQ and FIQ interrupts +#else + CPSIE i // Enable IRQ interrupts +#endif + + /* Wait for a thread to execute. */ + /* do */ + /* { */ + LDR r1, =_tx_thread_execute_ptr // Address of thread execute ptr + +__tx_thread_schedule_loop: + + LDR r0, [r1, #0] // Pickup next thread to execute + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_schedule_loop // If so, keep looking for a thread + + /* } */ + /* while(_tx_thread_execute_ptr == TX_NULL); */ + + /* Yes! We have a thread to execute. Lockout interrupts and + transfer control to it. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + + /* Setup the current thread pointer. */ + /* _tx_thread_current_ptr = _tx_thread_execute_ptr; */ + + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread + STR r0, [r1, #0] // Setup current thread pointer + + /* Increment the run count for this thread. */ + /* _tx_thread_current_ptr -> tx_thread_run_count++; */ + + LDR r2, [r0, #4] // Pickup run counter + LDR r3, [r0, #24] // Pickup time-slice for this thread + ADD r2, r2, #1 // Increment thread run-counter + STR r2, [r0, #4] // Store the new run counter + + /* Setup time-slice, if present. */ + /* _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; */ + + LDR r2, =_tx_timer_time_slice // Pickup address of time slice + // variable + LDR sp, [r0, #8] // Switch stack pointers + STR r3, [r2, #0] // Setup time-slice + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread entry function to indicate the thread is executing. */ + + MOV r5, r0 // Save r0 + BL _tx_execution_thread_enter // Call the thread execution enter function + MOV r0, r5 // Restore r0 +#endif + + /* Switch to the thread's stack. */ + /* sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; */ + + /* Determine if an interrupt frame or a synchronous task suspension frame + is present. */ + + LDMIA sp!, {r4, r5} // Pickup the stack type and saved CPSR + CMP r4, #0 // Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 // Setup SPSR for return +#ifdef __ARM_FP + LDR r1, [r0, #144] // Pickup the VFP enabled flag + CMP r1, #0 // Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore // No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} // Recover D0-D15 + LDR r4, [sp], #4 // Pickup FPSCR + VMSR FPSCR, r4 // Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ // Return to point of thread interrupt + +_tx_solicited_return: + +#ifdef __ARM_FP + LDR r1, [r0, #144] // Pickup the VFP enabled flag + CMP r1, #0 // Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore // No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} // Recover D8-D15 + LDR r4, [sp], #4 // Pickup FPSCR + VMSR FPSCR, r4 // Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MSR CPSR_cxsf, r5 // Recover CPSR + LDMIA sp!, {r4-r11, lr} // Return to thread synchronously + BX lr // Return to caller + +/* } */ + + +#ifdef __ARM_FP + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable, "function" +tx_thread_vfp_enable: + MRS r2, CPSR // Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr // Build current thread pointer address + LDR r1, [r0] // Pickup current thread pointer + CMP r1, #0 // Check for NULL thread pointer + BEQ __tx_no_thread_to_enable // If NULL, skip VFP enable + MOV r0, #1 // Build enable value + STR r0, [r1, #144] // Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 // Recover CPSR + BX LR // Return to caller + + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable, "function" +tx_thread_vfp_disable: + MRS r2, CPSR // Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr // Build current thread pointer address + LDR r1, [r0] // Pickup current thread pointer + CMP r1, #0 // Check for NULL thread pointer + BEQ __tx_no_thread_to_disable // If NULL, skip VFP disable + MOV r0, #0 // Build disable value + STR r0, [r1, #144] // Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 // Recover CPSR + BX LR // Return to caller +#endif diff --git a/ports/cortex_r4/ac6/src/tx_thread_stack_build.S b/ports/cortex_r4/ac6/src/tx_thread_stack_build.S new file mode 100644 index 00000000..57fbb637 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_stack_build.S @@ -0,0 +1,164 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + +#define SVC_MODE 0x13 // SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +#define CPSR_MASK 0xDF // Mask initial CPSR, IRQ & FIQ ints enabled +#else +#define CPSR_MASK 0x9F // Mask initial CPSR, IRQ ints enabled +#endif + +#define THUMB_BIT 0x20 // Thumb-bit + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) */ +/* { */ + .global _tx_thread_stack_build + .type _tx_thread_stack_build, "function" +_tx_thread_stack_build: + + + /* Build a fake interrupt frame. The form of the fake interrupt stack + on the Cortex-R4 should look like the following after it is built: + + Stack Top: 1 Interrupt stack frame type + CPSR Initial value for CPSR + a1 (r0) Initial value for a1 + a2 (r1) Initial value for a2 + a3 (r2) Initial value for a3 + a4 (r3) Initial value for a4 + v1 (r4) Initial value for v1 + v2 (r5) Initial value for v2 + v3 (r6) Initial value for v3 + v4 (r7) Initial value for v4 + v5 (r8) Initial value for v5 + sb (r9) Initial value for sb + sl (r10) Initial value for sl + fp (r11) Initial value for fp + ip (r12) Initial value for ip + lr (r14) Initial value for lr + pc (r15) Initial value for pc + 0 For stack backtracing */ + + /* Stack Bottom: (higher memory address) */ + + LDR r2, [r0, #16] // Pickup end of stack area + BIC r2, r2, #7 // Ensure 8-byte alignment + SUB r2, r2, #76 // Allocate space for the stack frame + + /* Actually build the stack frame. */ + + MOV r3, #1 // Build interrupt stack type + STR r3, [r2, #0] // Store stack type + MOV r3, #0 // Build initial register value + STR r3, [r2, #8] // Store initial r0 + STR r3, [r2, #12] // Store initial r1 + STR r3, [r2, #16] // Store initial r2 + STR r3, [r2, #20] // Store initial r3 + STR r3, [r2, #24] // Store initial r4 + STR r3, [r2, #28] // Store initial r5 + STR r3, [r2, #32] // Store initial r6 + STR r3, [r2, #36] // Store initial r7 + STR r3, [r2, #40] // Store initial r8 + STR r3, [r2, #44] // Store initial r9 + LDR r3, [r0, #12] // Pickup stack starting address + STR r3, [r2, #48] // Store initial r10 (sl) + MOV r3, #0 // Build initial register value + STR r3, [r2, #52] // Store initial r11 + STR r3, [r2, #56] // Store initial r12 + STR r3, [r2, #60] // Store initial lr + STR r1, [r2, #64] // Store initial pc + STR r3, [r2, #68] // 0 for back-trace + + MRS r3, CPSR // Pickup CPSR + BIC r3, r3, #CPSR_MASK // Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE // Build CPSR, SVC mode, interrupts enabled + TST r1, 1 // Test if Thumb bit is set in entry function address + ITE NE + ORRNE r3, r3, #THUMB_BIT // Yes, set the Thumb bit + BICEQ r3, r3, #THUMB_BIT // No, clear the Thumb bit + STR r3, [r2, #4] // Store initial CPSR + + /* Setup stack pointer. */ + /* thread_ptr -> tx_thread_stack_ptr = r2; */ + + STR r2, [r0, #8] // Save stack pointer in thread's + // control block + BX lr // Return to caller +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_system_return.S b/ports/cortex_r4/ac6/src/tx_thread_system_return.S new file mode 100644 index 00000000..4c025765 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_system_return.S @@ -0,0 +1,162 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ +/* #include "tx_timer.h" */ + + + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_thread_exit +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the ThreadX system. Only a */ +/* minimal context is saved since the compiler assumes temp registers */ +/* are going to get slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_schedule Thread scheduling loop */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_system_return(VOID) */ +/* { */ + .global _tx_thread_system_return + .type _tx_thread_system_return, "function" +_tx_thread_system_return: + + /* Save minimal context on the stack. */ + + STMDB sp!, {r4-r11, lr} // Save minimal context + LDR r5, =_tx_thread_current_ptr // Pickup address of current ptr + LDR r6, [r5, #0] // Pickup current thread pointer + +#ifdef __ARM_FP + LDR r0, [r6, #144] // Pickup the VFP enabled flag + CMP r0, #0 // Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save // No, skip VFP solicited save + VMRS r4, FPSCR // Pickup the FPSCR + STR r4, [sp, #-4]! // Save FPSCR + VSTMDB sp!, {D8-D15} // Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 // Build a solicited stack type + MRS r1, CPSR // Pickup the CPSR + STMDB sp!, {r0-r1} // Save type and CPSR + + /* Lockout interrupts. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#else + CPSID i // Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the thread exit function to indicate the thread is no longer executing. */ + + BL _tx_execution_thread_exit // Call the thread exit function +#endif + LDR r2, =_tx_timer_time_slice // Pickup address of time slice + LDR r1, [r2, #0] // Pickup current time slice + + /* Save current stack and switch to system stack. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + /* sp = _tx_thread_system_stack_ptr; */ + + STR sp, [r6, #8] // Save thread stack pointer + + /* Determine if the time-slice is active. */ + /* if (_tx_timer_time_slice) */ + /* { */ + + MOV r4, #0 // Build clear value + CMP r1, #0 // Is a time-slice active? + BEQ __tx_thread_dont_save_ts // No, don't save the time-slice + + /* Save the current remaining time-slice. */ + /* _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; */ + /* _tx_timer_time_slice = 0; */ + + STR r4, [r2, #0] // Clear time-slice + STR r1, [r6, #24] // Store current time-slice + + /* } */ +__tx_thread_dont_save_ts: + + /* Clear the current thread pointer. */ + /* _tx_thread_current_ptr = TX_NULL; */ + + STR r4, [r5, #0] // Clear current thread pointer + + B _tx_thread_schedule // Jump to scheduler! + +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S b/ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..0b7134bd --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_thread_vectored_context_save.S @@ -0,0 +1,193 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_thread.h" */ + + + .global _tx_thread_system_state + .global _tx_thread_current_ptr +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + .global _tx_execution_isr_enter +#endif + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_vectored_context_save Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* None */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_thread_vectored_context_save(VOID) */ +/* { */ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save, "function" +_tx_thread_vectored_context_save: + + /* Upon entry to this routine, it is assumed that IRQ interrupts are locked + out, we are in IRQ mode, and all registers are intact. */ + + /* Check for a nested interrupt condition. */ + /* if (_tx_thread_system_state++) */ + /* { */ + +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if // Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state // Pickup address of system state var + LDR r2, [r3, #0] // Pickup system state + CMP r2, #0 // Is this the first interrupt? + BEQ __tx_thread_not_nested_save // Yes, not a nested context save + + /* Nested interrupt condition. */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + + /* Note: Minimal context of interrupted thread is already saved. */ + + /* Return to the ISR. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + BX lr // Return to caller + + +__tx_thread_not_nested_save: + /* } */ + + /* Otherwise, not nested, check to see if a thread was running. */ + /* else if (_tx_thread_current_ptr) */ + /* { */ + + ADD r2, r2, #1 // Increment the interrupt counter + STR r2, [r3, #0] // Store it back in the variable + LDR r1, =_tx_thread_current_ptr // Pickup address of current thread ptr + LDR r0, [r1, #0] // Pickup current thread pointer + CMP r0, #0 // Is it NULL? + BEQ __tx_thread_idle_system_save // If so, interrupt occurred in + // scheduling loop - nothing needs saving! + + /* Note: Minimal context of interrupted thread is already saved. */ + + /* Save the current stack pointer in the thread's control block. */ + /* _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; */ + + /* Switch to the system stack. */ + /* sp = _tx_thread_system_stack_ptr; */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + BX lr // Return to caller + + /* } */ + /* else */ + /* { */ + +__tx_thread_idle_system_save: + + /* Interrupt occurred in the scheduling loop. */ + + /* Not much to do here, just adjust the stack pointer, and return to IRQ + processing. */ + + MOV r10, #0 // Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY + + /* Call the ISR enter function to indicate an ISR is executing. */ + + PUSH {lr} // Save ISR lr + BL _tx_execution_isr_enter // Call the ISR enter function + POP {lr} // Recover ISR lr +#endif + + ADD sp, sp, #32 // Recover saved registers + + BX lr // Return to caller + + /* } */ +/* } */ diff --git a/ports/cortex_r4/ac6/src/tx_timer_interrupt.S b/ports/cortex_r4/ac6/src/tx_timer_interrupt.S new file mode 100644 index 00000000..1426b7f9 --- /dev/null +++ b/ports/cortex_r4/ac6/src/tx_timer_interrupt.S @@ -0,0 +1,257 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +/* #define TX_SOURCE_CODE */ + + +/* Include necessary system files. */ + +/* #include "tx_api.h" */ +/* #include "tx_timer.h" */ +/* #include "tx_thread.h" */ + + +/* Define Assembly language external references... */ + + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice + .global _tx_timer_expiration_process + + +#ifdef TX_THUMB_MODE + .thumb +#else + .arm +#endif + .text + .eabi_attribute Tag_ABI_align_preserved, 1 +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Cortex-R4/AC6 */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +/* VOID _tx_timer_interrupt(VOID) */ +/* { */ + .global _tx_timer_interrupt + .type _tx_timer_interrupt, "function" +_tx_timer_interrupt: + + /* Upon entry to this routine, it is assumed that context save has already + been called, and therefore the compiler scratch registers are available + for use. */ + + /* Increment the system clock. */ + /* _tx_timer_system_clock++; */ + + LDR r1, =_tx_timer_system_clock // Pickup address of system clock + LDR r0, [r1, #0] // Pickup system clock + ADD r0, r0, #1 // Increment system clock + STR r0, [r1, #0] // Store new system clock + + /* Test for time-slice expiration. */ + /* if (_tx_timer_time_slice) */ + /* { */ + + LDR r3, =_tx_timer_time_slice // Pickup address of time-slice + LDR r2, [r3, #0] // Pickup time-slice + CMP r2, #0 // Is it non-active? + BEQ __tx_timer_no_time_slice // Yes, skip time-slice processing + + /* Decrement the time_slice. */ + /* _tx_timer_time_slice--; */ + + SUB r2, r2, #1 // Decrement the time-slice + STR r2, [r3, #0] // Store new time-slice value + + /* Check for expiration. */ + /* if (__tx_timer_time_slice == 0) */ + + CMP r2, #0 // Has it expired? + BNE __tx_timer_no_time_slice // No, skip expiration processing + + /* Set the time-slice expired flag. */ + /* _tx_timer_expired_time_slice = TX_TRUE; */ + + LDR r3, =_tx_timer_expired_time_slice // Pickup address of expired flag + MOV r0, #1 // Build expired value + STR r0, [r3, #0] // Set time-slice expiration flag + + /* } */ + +__tx_timer_no_time_slice: + + /* Test for timer expiration. */ + /* if (*_tx_timer_current_ptr) */ + /* { */ + + LDR r1, =_tx_timer_current_ptr // Pickup current timer pointer addr + LDR r0, [r1, #0] // Pickup current timer + LDR r2, [r0, #0] // Pickup timer list entry + CMP r2, #0 // Is there anything in the list? + BEQ __tx_timer_no_timer // No, just increment the timer + + /* Set expiration flag. */ + /* _tx_timer_expired = TX_TRUE; */ + + LDR r3, =_tx_timer_expired // Pickup expiration flag address + MOV r2, #1 // Build expired value + STR r2, [r3, #0] // Set expired flag + B __tx_timer_done // Finished timer processing + + /* } */ + /* else */ + /* { */ +__tx_timer_no_timer: + + /* No timer expired, increment the timer pointer. */ + /* _tx_timer_current_ptr++; */ + + ADD r0, r0, #4 // Move to next timer + + /* Check for wrap-around. */ + /* if (_tx_timer_current_ptr == _tx_timer_list_end) */ + + LDR r3, =_tx_timer_list_end // Pickup addr of timer list end + LDR r2, [r3, #0] // Pickup list end + CMP r0, r2 // Are we at list end? + BNE __tx_timer_skip_wrap // No, skip wrap-around logic + + /* Wrap to beginning of list. */ + /* _tx_timer_current_ptr = _tx_timer_list_start; */ + + LDR r3, =_tx_timer_list_start // Pickup addr of timer list start + LDR r0, [r3, #0] // Set current pointer to list start + +__tx_timer_skip_wrap: + + STR r0, [r1, #0] // Store new current timer pointer + /* } */ + +__tx_timer_done: + + + /* See if anything has expired. */ + /* if ((_tx_timer_expired_time_slice) (_tx_timer_expired)) */ + /* { */ + + LDR r3, =_tx_timer_expired_time_slice // Pickup addr of expired flag + LDR r2, [r3, #0] // Pickup time-slice expired flag + CMP r2, #0 // Did a time-slice expire? + BNE __tx_something_expired // If non-zero, time-slice expired + LDR r1, =_tx_timer_expired // Pickup addr of other expired flag + LDR r0, [r1, #0] // Pickup timer expired flag + CMP r0, #0 // Did a timer expire? + BEQ __tx_timer_nothing_expired // No, nothing expired + +__tx_something_expired: + + + STMDB sp!, {r0, lr} // Save the lr register on the stack + // and save r0 just to keep 8-byte alignment + + /* Did a timer expire? */ + /* if (_tx_timer_expired) */ + /* { */ + + LDR r1, =_tx_timer_expired // Pickup addr of expired flag + LDR r0, [r1, #0] // Pickup timer expired flag + CMP r0, #0 // Check for timer expiration + BEQ __tx_timer_dont_activate // If not set, skip timer activation + + /* Process timer expiration. */ + /* _tx_timer_expiration_process(); */ + + BL _tx_timer_expiration_process // Call the timer expiration handling routine + + /* } */ +__tx_timer_dont_activate: + + /* Did time slice expire? */ + /* if (_tx_timer_expired_time_slice) */ + /* { */ + + LDR r3, =_tx_timer_expired_time_slice // Pickup addr of time-slice expired + LDR r2, [r3, #0] // Pickup the actual flag + CMP r2, #0 // See if the flag is set + BEQ __tx_timer_not_ts_expiration // No, skip time-slice processing + + /* Time slice interrupted thread. */ + /* _tx_thread_time_slice(); */ + + BL _tx_thread_time_slice // Call time-slice processing + + /* } */ + +__tx_timer_not_ts_expiration: + + LDMIA sp!, {r0, lr} // Recover lr register (r0 is just there for + // the 8-byte stack alignment + + /* } */ + +__tx_timer_nothing_expired: + BX lr // Return to caller + +/* } */ diff --git a/ports/cortex_r4/gnu/example_build/build_threadx.bat b/ports/cortex_r4/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..106c3447 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r4/gnu/example_build/build_threadx_sample.bat b/ports/cortex_r4/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..517b6d62 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r4 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-r4 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_r4/gnu/example_build/crt0.S b/ports/cortex_r4/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_r4/gnu/example_build/libc.a b/ports/cortex_r4/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_r4/gnu/example_build/libc.a differ diff --git a/ports/cortex_r4/gnu/example_build/libgcc.a b/ports/cortex_r4/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_r4/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_r4/gnu/example_build/reset.S b/ports/cortex_r4/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_r4/gnu/example_build/sample_threadx.c b/ports/cortex_r4/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/gnu/example_build/sample_threadx.ld b/ports/cortex_r4/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_r4/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_r4/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..69779012 --- /dev/null +++ b/ports/cortex_r4/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_r4/gnu/inc/tx_port.h b/ports/cortex_r4/gnu/inc/tx_port.h new file mode 100644 index 00000000..b5a9bced --- /dev/null +++ b/ports/cortex_r4/gnu/inc/tx_port.h @@ -0,0 +1,316 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_r4/gnu/readme_threadx.txt b/ports/cortex_r4/gnu/readme_threadx.txt new file mode 100644 index 00000000..c89d5940 --- /dev/null +++ b/ports/cortex_r4/gnu/readme_threadx.txt @@ -0,0 +1,496 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R4 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-r4 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-r4 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R4 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/gnu/src/tx_thread_context_restore.S b/ports/cortex_r4/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..8f37269c --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,256 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif +@ + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_context_save.S b/ports/cortex_r4/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..52447586 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..5437c7af --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,247 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..48ebb94f --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..e30a7146 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..7679d8aa --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..cbe76857 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..9fe7a729 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..e89b7999 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..c5800dfe --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..c7675bf2 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_schedule.S b/ports/cortex_r4/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..365e5678 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_schedule.S @@ -0,0 +1,250 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + BL _tx_execution_thread_enter @ Call the thread execution enter function +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt +@ +_tx_solicited_return: +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 @ Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously + MSR CPSR_cxsf, r0 @ Recover CPSR +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ +@ +#ifdef TX_ENABLE_VFP_SUPPORT + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +@ + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +#endif + diff --git a/ports/cortex_r4/gnu/src/tx_thread_stack_build.S b/ports/cortex_r4/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..2b573dce --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the ARM9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r4/gnu/src/tx_thread_system_return.S b/ports/cortex_r4/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..9d18837f --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_system_return.S @@ -0,0 +1,177 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Lockout interrupts. */ +@ + MRS r1, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Enable IRQ and FIQ interrupts +#else + CPSID i @ Enable IRQ interrupts +#endif +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + LDR r5, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r6, [r5] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r0, [r6, #144] @ Pickup the VFP enabled flag + CMP r0, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r4, FPSCR @ Pickup the FPSCR + STR r4, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif +@ + MOV r0, #0 @ Build a solicited stack type + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r6, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2] @ Clear time-slice + STR r1, [r6, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r5] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..9f69fa32 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_r4/gnu/src/tx_timer_interrupt.S b/ports/cortex_r4/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..629e0928 --- /dev/null +++ b/ports/cortex_r4/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-R4/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_r4/iar/example_build/azure_rtos.eww b/ports/cortex_r4/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_r4/iar/example_build/cstartup.s b/ports/cortex_r4/iar/example_build/cstartup.s new file mode 100644 index 00000000..7a46bec0 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/cstartup.s @@ -0,0 +1,163 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 49919 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __iar_program_start + EXTERN Undefined_Handler + EXTERN SWI_Handler + EXTERN Prefetch_Handler + EXTERN Abort_Handler + EXTERN IRQ_Handler + EXTERN FIQ_Handler + + DATA + +__iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__vector: ; Make this a DATA label, so that stack usage + ; analysis doesn't consider it an uncalled fun + + ARM + + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + + DATA + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD Undefined_Handler +SWI_Addr: DCD SWI_Handler +Prefetch_Addr: DCD Prefetch_Handler +Abort_Addr: DCD Abort_Handler +IRQ_Addr: DCD IRQ_Handler +FIQ_Addr: DCD FIQ_Handler + + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reset execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + + EXTERN __cmain + REQUIRE __vector + EXTWEAK __iar_init_core + EXTWEAK __iar_init_vfp + + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +#define MODE_MSK 0x1F ; Bit mask for mode bits in CPSR + +#define USR_MODE 0x10 ; User mode +#define FIQ_MODE 0x11 ; Fast Interrupt Request mode +#define IRQ_MODE 0x12 ; Interrupt Request mode +#define SVC_MODE 0x13 ; Supervisor mode +#define ABT_MODE 0x17 ; Abort mode +#define UND_MODE 0x1B ; Undefined Instruction mode +#define SYS_MODE 0x1F ; System mode + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Turn on core features assumed to be enabled. + FUNCALL __iar_program_start, __iar_init_core + BL __iar_init_core + + ;; Initialize VFP (if needed). + FUNCALL __iar_program_start, __iar_init_vfp + BL __iar_init_vfp + +;;; +;;; Add more initialization here +;;; + +;;; Continue to __cmain for C-level initialization. + + FUNCALL __iar_program_start, __cmain + B __cmain + + END diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.c b/ports/cortex_r4/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..983109cc --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.c @@ -0,0 +1,376 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.dep b/ports/cortex_r4/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..6c811ae0 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.dep @@ -0,0 +1,253 @@ + + + 4 + 1024685290 + + Debug + + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\rti.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\rti.__cstat.et + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\Debug\Obj\demo.r79 + $TOOLKIT_DIR$\lib\sh7Sxs_b.a + $PROJ_DIR$\tx_api.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\Debug\List\cstartup.lst + $TOOLKIT_DIR$\inc\intrinsics.h + $PROJ_DIR$\Debug\Obj\rti.o + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\ycheck.h + $PROJ_DIR$\tx_execution_profile.c + $TOOLKIT_DIR$\lib\rt7Sx_tb.a + $PROJ_DIR$\tx_cstartup.s79 + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\Debug\Obj\cstartup.o + $PROJ_DIR$\Debug\Obj\rti.pbi + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\tx_initialize_low_level.s79 + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\cstartup.s + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $PROJ_DIR$\sample_threadx.icf + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\lib\dl7Sx_tbn.a + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\TX_ILL.s79 + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\rti.c + $TOOLKIT_DIR$\inc\string.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\lib\m7Sx_tbv.a + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\DLib_Product.h + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + [ROOT_NODE] + + + ILINK + 1 48 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 48 + + + + + ILINK + 40 28 19 33 58 10 25 59 43 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 50 + + + BICOMP + 30 + + + + + ICCARM + 11 18 60 23 8 12 49 61 6 14 21 54 56 16 + + + BICOMP + 11 18 60 23 8 12 61 6 14 21 54 56 16 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 39 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 58 20 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 58 20 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 19 + + + BICOMP + 51 + + + __cstat + 62 + + + + + ICCARM + 38 37 22 5 47 0 63 45 2 57 3 55 13 35 36 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 28 15 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 28 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 41 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 9 + + + + + ICCARM + 11 18 + + + + + $PROJ_DIR$\rti.c + + + ICCARM + 17 + + + BICOMP + 29 + + + __cstat + 7 + + + + + ICCARM + 4 + + + BICOMP + 4 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.ewd b/ports/cortex_r4/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..28a9ad4c --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.ewp b/ports/cortex_r4/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..7557efe5 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2140 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.ewt b/ports/cortex_r4/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..77fe620f --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r4/iar/example_build/sample_threadx.icf b/ports/cortex_r4/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..13723763 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; +define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define symbol __region_DRAM_start__ = 0x80000000; +define symbol __region_DRAM_end__ = 0x807FFFFF; +define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; +place in DRAM_region { section DRAM }; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..d635fcef --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 248 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000004A00259600000200000013860000010000002981000002000000578600000100000003DA000001000000108600005F00000001840000010000005992000001000000268100000100000000DA00000200000008B000000200000015810000030000005486000001000000568400000100000029E10000020000002392000001000000ED8000000100000020810000010000000F810000010000000A860000010000000C810000160000000D8000000100000001E10000010000001D81000001000000EA8000000100000008DA000001000000048600000100000003DC00000100000005DA000001000000249600000100000017810000020000005686000006000000038400000500000002DA00000100000028810000010000009A86000001000000148100000300000007B0000001000000008400000100000000810000030000000C8600000100000003E10000010000001A86000001000000EC800000010000005E860000030000001F8100000100000009860000010000000E81000001000000E9800000010000000B8100000200000000E1000001000000148600002500000004DA00000100000058860000010000001882000003000000118600002500000002840000010000000086000001000000F480000001000000558600000100000009B0000001000000239600000800000001DA00000100000024810000010000004681000028000000EE8000000100000003B000000100000008860000010000000D81000002000000EB800000010000005D86000001000000E88000000100000006DA0000010000001686000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 000000007E040000000A000065050000 + 0000000067040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 040000007F040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 00000000320000004001000063040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF400100003200000044010000630400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF0000000063040000000A000067040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E650080000001000000000000007E040000000A0000650500000000000067040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..2c5210a4 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..1abcd287 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..529ac91f --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R4" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE32" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..9ea83d29 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r4\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.crun b/ports/cortex_r4/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..87de74d4 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1797 @@ + + + + + + + 447 + 27 + 27 + 2010398909 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + 47 + 1666 + + + 20 + 915 + 244 + 61 + + + + 2 + 0 + 0 + + + + + + 3 + 0 + 0 + + + 0 + 1 + 0 + + + + + + + + 2 + 0 + 0 + + + 187 + 100 + 100 + 100 + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + + + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 161 + 150 + 100 + 100 + + + + + + + + TabID-32281-8114 + Workspace + Workspace + + + <ws> + <ws>/sample_threadx + <ws>/sample_threadx/Common sources + <ws>/sample_threadx/Common sources/tx_cstartup.s79 + sample_threadx + sample_threadx/Output + sample_threadx/Output/sample_threadx.out + sample_threadx/Output/sample_threadx.out/Output + + + + + 0 + + + + + TabID-31758-8124 + Debug Log + Debug-Log + + + + TabID-9738-8128 + Build + Build + + + + TabID-20156-25745 + Breakpoints + Breakpoints + + + 0 + + + + + TabID-19697-5905 + Thread List + TX-THREAD + + 1 + + + + TabID-19175-5914 + Message Queues + TX-MESSAGEQUEUE + + + TabID-29400-5927 + Semaphores + TX-SEMAPHORE + + + TabID-6858-5940 + Mutexes + TX-MUTEX + + + TabID-6335-5950 + Byte Pools + TX-BYTEPOOL + + + TabID-16561-5963 + Block Pools + TX-BLOCKPOOL + + + TabID-26786-5976 + Timers + TX-TIMER + + + TabID-26264-5986 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + TabID-4531-19825 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 40 + 1720 + 1720 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 572 + 521 + -2 + -2 + 151 + 168 + 99473 + 181425 + 344532 + 619870 + + + + + + + + + + + -2 + -2 + 572 + 307 + -2 + -2 + 214 + 217 + 140975 + 234341 + 203557 + 619870 + + + + + + + + + + + -2 + -2 + 65 + 1520 + -2 + -2 + 1522 + 67 + 1002635 + 72354 + 99473 + 181425 + + + + + + + + + 63 + -2 + 261 + 1520 + -2 + 63 + 1522 + 198 + 1002635 + 213823 + 142292 + 213823 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + Disassembly + _I0 + + + 500 + 20 + + + 0x3e94 + 0x9ec + 0x1c9c + IRQ_Handler + + 1 + 1 + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + E80000004A00259600000200000013860000010000002981000002000000578600000100000003DA000001000000108600005F00000001840000010000005992000001000000268100000100000000DA00000200000008B000000200000015810000030000005486000001000000568400000100000029E10000020000002392000001000000ED8000000100000020810000010000000F810000010000000A860000010000000C810000160000000D8000000100000001E10000010000001D81000001000000EA8000000100000008DA000001000000048600000100000003DC00000100000005DA000001000000249600000100000017810000020000005686000006000000038400000500000002DA00000100000028810000010000009A86000001000000148100000300000007B0000001000000008400000100000000810000030000000C8600000100000003E10000010000001A86000001000000EC800000010000005E860000030000001F8100000100000009860000010000000E81000006000000E9800000010000000B8100000200000000E1000001000000148600002500000004DA00000100000058860000010000001882000003000000118600002500000002840000010000000086000001000000F480000001000000558600000100000009B0000001000000239600000800000001DA00000100000024810000010000004681000028000000EE8000000100000003B000000100000008860000010000000D81000002000000EB800000010000005D86000001000000E88000000100000006DA0000010000001686000001000000 + + + 41000D8400000F84000008840000FFFFFFFF54840000328100001C81000009840000D4840000E8800000838600005886000001B0000002B0000003B0000004B0000005B0000006B0000007B0000008B0000009B000000AB000000BB000000CB000000DB000000EB000000FB0000000B000002481000000880000018800000288000003880000048800000588000000DA000001DA000002DA000003DA000004DA000005DA000006DA000007DA000008DA000009DA00000ADA00000BDA00000CDA00000DDA00001B8600001C8600001D8600001E8600005A8600005B86000053860000A4860000A3860000439200001E920000289200002992000024960000259600001F960000 + 3A00028600000F0000005786000018000000268100005B0000001581000052000000599200002400000029E100006F00000007E1000069000000239200000000000004E10000670000000A8600002A0000000D8000004400000001E1000064000000008D00001D00000007860000270000001D920000110000000486000024000000018600000E00000017810000540000009A8600001600000014810000510000000084000077000000259200001900000030840000810000000E8400007F0000000081000046000000449200002200000025E100006D00000003E10000660000001A8600003100000009860000290000001F9200001F00000022E100006A0000000B8100004C00000000E10000630000008E8600003A00000006860000260000002D92000021000000038600001000000041E10000740000006986000037000000008600000D0000001681000053000000558600000600000023960000870000000E86000017000000518400008500000005E10000680000000B8600002B00000024E100006C0000000D8100004E00000002E1000065000000A18600003B000000C3860000030000000886000028000000C08600000A000000168600003000000005860000250000002C92000020000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 34050000AF0400005606000060050000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 4294967295 + 000000004900000006010000CA020000 + 000000004C0000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34062 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34094 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 7A0000005F0000009C01000010010000 + 04000000B5040000A006000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 7A0000005F000000FA020000F0000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 7A0000005F00000080010000C0010000 + D504000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34066 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0x080018c4 + 0x080001f8 + 0x08001cac + 0x080002f8 + + 0 + 134224072 + 134224072 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 8389003 + + + 34070 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 7A0000005F00000080010000C0010000 + C405000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + Access + Current CPU Registers + Value + + + 180 + 180 + 180 + + + sctlr + + 0 + + + 34076 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 7A0000005F0000009C01000010010000 + 0000000002020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + ID + Max Stack Usage + Name + Priority + Run Count + Stack End + Stack Ptr + Stack Size + Stack Start + State + + + 125 + 125 + 100 + 65 + 75 + 125 + 125 + 75 + 125 + 100 + + + + 34091 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 7A0000005F00000080010000C0010000 + 040000004A000000020100008A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34107 + 7A0000005F00000080010000C0010000 + 00000000600000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34096 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 7A0000005F0000002802000020010000 + 0000000000000000AE010000C1000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 7A0000005F00000080010000C0010000 + F10700004C000000000A000099040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 173 + 150 + 100 + 100 + + + + 34104 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 000000007E000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000040000001000000FFFFFFFFFFFFFFFFED0700004C000000F1070000990400000100000002000010040000000100000028F9FFFFC4010000378500000000000000000000000000000000000001000000378500000100000037850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A01000099040000010000000200001004000000010000000000000000000000FFFFFFFF010000003B850000FFFF02000B004354616262656450616E650010000001000000000000004900000006010000CA020000000000004C0000000601000099040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000003B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF3B85000001000000FFFFFFFF3B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF00000000FE010000A4060000020200000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001D85000000000000000000000000000000000000010000001D850000010000001D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001C85000000000000000000000000000000000000010000001C850000010000001C850000000000000040000000000000FFFFFFFFFFFFFFFFC005000032000000C4050000B3020000000000000200000004000000010000001CFBFFFFFE0000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EE010000D1040000F2010000000000000100000004000000010000000000000000000000FFFFFFFF0400000015850000168500001785000018850000018000800000000000000000000009020000D1040000CA02000000000000F2010000D1040000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001585000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001685000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001785000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001885000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1585000001000000FFFFFFFF15850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000128500000000000000000000000000000000000001000000128500000100000012850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFFD104000032000000D5040000B30200000000000002000000040000000100000000F9FFFFB50000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF08000000058500000C8500000E8500000F850000108500002E85000036850000048500000180008000000100000000000000CE020000A40600007F030000000000009D040000000A00004E050000000000004080005608000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000C85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000002E85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B42007200650061006B0070006F0069006E0074007300010000000485000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000A406000004020000000000000100000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000080000000000000FFFFFFFFFFFFFFFF00000000B4020000A4060000B8020000000000000100000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000080000000000000FFFFFFFFFFFFFFFF0000000020020000A406000024020000000000000100000004000000010000000000000000000000FFFFFFFF010000004285000001800080000000000000000000003B020000A4060000CB0200000000000024020000A4060000B4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000004285000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF4285000001000000FFFFFFFF42850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000010040000000100000000000000000000004E85000000000000000000000000000000000000010000004E850000010000004E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000063000000FFFEFF000000000000000000000000000100000001000000018001E100000000000064000000FFFEFF000000000000000000000000000100000001000000018003E100000000040066000000FFFEFF0000000000000000000000000001000000010000000180008100000000000047000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E100000000040069000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006A000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006D000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040070000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040071000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000400FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005A000000FFFEFF000000000000000000000000000100000001000000018024E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006E000000FFFEFF000000000000000000000000000100000001000000018029E10000000004006F000000FFFEFF0000000000000000000000000001000000010000000180028100000000040049000000FFFEFF000000000000000000000000000100000001000000018029810000000004005E000000FFFEFF000000000000000000000000000100000001000000018027810000000004005C000000FFFEFF000000000000000000000000000100000001000000018028810000000004005D000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040056000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040057000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004D000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004E000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000062000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000058000000FFFEFF0000000000000000000000000001000000010000000180208100000000000059000000FFFEFF0000000000000000000000000001000000010000000180468100000000020060000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 00000000180000001503000032000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + 34108 + 4608000060000000F4090000F0000000 + 040000003C020000AA0100009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 46080000600000006809000010010000 + 0000000038020000A4060000B4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 46080000600000004C090000C0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + 4608000060000000F409000020010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 46080000600000006809000010010000 + 00000000B8020000A406000068030000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 46080000600000006809000010010000 + 0000000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34124 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34125 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34126 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34127 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34123 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..a6623ee1 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,130 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 2137572426 + + + 0 + + + HL512000 + + 0 + 2 + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + 0 + 1 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 + + + 0 + + + 1 + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups b/ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx.reggroups @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat b/ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat new file mode 100644 index 00000000..192ce771 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/sample_threadx_Debug_xds100board.dat @@ -0,0 +1,32 @@ +# config version=3.5 +$ sepk + pod_drvr=jioxds110.dll + pod_port=0 + pod_serial=HL512000 +$ / +$ product + title="Texas Instruments XDS110 USB" + alias=TI_XDS110_USB + name=XDS110 +$ / +$ uscif + tdoedge=FALL + tclk_program=DEFAULT + tclk_frequency=2.5MHz +$ / +$ dot7 + dts_usage=nothing +$ / +$ swd + swd_debug=disabled + swo_data=aux_uart +$ / +@ icepick family=icepick_c irbits=6 drbits=1 subpaths=2 + & port17 address=17 default=no custom=no force=yes pseudo=no + & port16 address=16 default=no custom=no force=yes pseudo=no + @ dap family=cs_dap irbits=4 drbits=1 subpaths=1 identify=0 + & portr4 type=debug address=0 default=no custom=no force=no pseudo=no + @ cortexr4 family=cortex_rxx irbits=0 drbits=0 address=0x80001000 identify=0x02000100 traceid=0x0 + & / + & / +# / diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..d76cfad9 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..1c1ba13b --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..529ac91f --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R4" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE32" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..ef6d6dd5 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.0\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.crun b/ports/cortex_r4/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.dbgdt b/ports/cortex_r4/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_r4/iar/example_build/settings/tx.dnx b/ports/cortex_r4/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_r4/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r4/iar/example_build/tx.dep b/ports/cortex_r4/iar/example_build/tx.dep new file mode 100644 index 00000000..09806296 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.dep @@ -0,0 +1,10488 @@ + + + 4 + 554479155 + + Debug + + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\tx.pbd + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Txe_sig.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Tx_qig.c + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Tx_td.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Tx_br.c + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Tx_times.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 64 157 355 486 629 705 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 64 157 505 + + + + + $PROJ_DIR$\Debug\Obj\tx.pbd + + + BILINK + 868 306 522 429 280 484 369 524 670 439 722 751 702 432 610 42 408 314 745 710 572 44 616 47 708 915 923 941 703 807 936 383 7 322 873 406 795 786 904 445 318 921 674 721 885 856 520 734 617 279 631 323 331 434 578 28 444 360 886 531 40 785 611 397 405 528 749 328 842 46 325 756 832 744 560 337 794 684 783 659 595 830 942 719 567 443 538 459 573 312 655 945 634 563 416 384 808 8 5 792 798 717 56 928 357 456 803 388 311 854 37 551 667 789 612 944 742 546 508 411 727 51 765 594 822 512 412 894 652 882 374 735 888 298 782 344 620 9 938 17 41 301 932 511 54 451 557 859 600 682 869 922 381 724 494 809 436 879 570 425 678 373 305 27 351 947 907 294 853 579 864 821 813 849 624 435 309 577 50 558 712 476 393 303 501 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 64 157 486 739 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 64 157 705 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 656 + + + BICOMP + 868 + + + __cstat + 514 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 65 + + + BICOMP + 441 157 604 120 64 65 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 673 + + + BICOMP + 306 + + + __cstat + 804 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 65 + + + BICOMP + 441 157 604 120 64 65 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 861 + + + BICOMP + 807 + + + __cstat + 548 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 84 + + + BICOMP + 84 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 644 + + + BICOMP + 280 + + + __cstat + 627 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 65 + + + BICOMP + 217 604 441 64 65 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 857 + + + BICOMP + 751 + + + __cstat + 386 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 81 + + + BICOMP + 157 332 477 120 450 564 604 64 81 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 858 + + + BICOMP + 702 + + + __cstat + 638 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 81 + + + BICOMP + 564 450 604 217 332 477 64 81 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 812 + + + BICOMP + 408 + + + __cstat + 532 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 332 477 81 450 564 604 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 356 + + + BICOMP + 42 + + + __cstat + 906 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 332 477 81 450 564 604 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 545 + + + BICOMP + 432 + + + __cstat + 463 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 81 + + + BICOMP + 564 81 450 604 217 332 477 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 910 + + + BICOMP + 572 + + + __cstat + 647 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 81 + + + BICOMP + 564 81 450 604 217 157 332 477 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 35 + + + BICOMP + 610 + + + __cstat + 622 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 81 + + + BICOMP + 564 450 604 217 332 477 64 81 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 433 + + + BICOMP + 44 + + + __cstat + 403 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 84 + + + BICOMP + 450 304 120 780 64 84 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 834 + + + BICOMP + 369 + + + __cstat + 890 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 441 604 65 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 21 + + + BICOMP + 522 + + + __cstat + 500 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 65 + + + BICOMP + 217 604 441 64 65 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 784 + + + BICOMP + 314 + + + __cstat + 399 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 332 477 81 450 564 604 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 420 + + + BICOMP + 745 + + + __cstat + 650 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 81 + + + BICOMP + 564 81 450 604 217 332 477 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 15 + + + BICOMP + 439 + + + __cstat + 22 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 65 + + + BICOMP + 65 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 473 + + + BICOMP + 429 + + + __cstat + 641 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 65 + + + BICOMP + 65 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 552 + + + BICOMP + 722 + + + __cstat + 499 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 81 + + + BICOMP + 157 332 477 120 450 564 604 64 81 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 750 + + + BICOMP + 670 + + + __cstat + 288 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 65 + + + BICOMP + 65 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 535 + + + BICOMP + 616 + + + __cstat + 537 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 84 + + + BICOMP + 157 780 450 217 304 64 84 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 43 + + + BICOMP + 47 + + + __cstat + 34 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 84 + + + BICOMP + 84 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 492 + + + BICOMP + 708 + + + __cstat + 410 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 84 + + + BICOMP + 157 84 780 450 217 304 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 893 + + + BICOMP + 915 + + + __cstat + 609 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 84 + + + BICOMP + 157 780 450 217 304 64 84 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 833 + + + BICOMP + 941 + + + __cstat + 295 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 450 304 84 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 651 + + + BICOMP + 484 + + + __cstat + 840 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 441 604 65 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 863 + + + BICOMP + 703 + + + __cstat + 390 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 450 304 84 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 934 + + + BICOMP + 524 + + + __cstat + 566 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 441 604 65 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 530 + + + BICOMP + 936 + + + __cstat + 800 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 84 + + + BICOMP + 157 780 450 217 304 64 84 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 773 + + + BICOMP + 710 + + + __cstat + 354 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 81 + + + BICOMP + 332 477 120 157 450 564 604 64 81 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 428 + + + BICOMP + 923 + + + __cstat + 768 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 450 304 84 780 64 157 604 441 274 332 564 477 308 + + + + + [ROOT_NODE] + + + IARCHIVE + 695 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 701 + + + BICOMP + 832 + + + __cstat + 474 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 370 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 738 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 847 + + + BICOMP + 531 + + + __cstat + 599 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 157 121 217 604 441 64 120 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 589 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 755 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 872 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 407 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 338 + + + BICOMP + 842 + + + __cstat + 771 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 584 + + + BICOMP + 684 + + + __cstat + 699 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 424 + + + BICOMP + 783 + + + __cstat + 536 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 608 + + + BICOMP + 560 + + + __cstat + 787 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 157 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 899 + + + BICOMP + 749 + + + __cstat + 603 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 441 604 121 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 496 + + + BICOMP + 659 + + + __cstat + 361 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 157 332 477 217 450 564 604 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 806 + + + BICOMP + 595 + + + __cstat + 574 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 157 450 564 604 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 820 + + + BICOMP + 328 + + + __cstat + 681 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 441 604 121 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 273 + + + BICOMP + 886 + + + __cstat + 895 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 131 + + + BICOMP + 157 780 217 274 308 64 131 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 541 + + + BICOMP + 785 + + + __cstat + 446 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 121 + + + BICOMP + 157 217 604 441 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 823 + + + BICOMP + 611 + + + __cstat + 592 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 845 + + + BICOMP + 397 + + + __cstat + 767 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 275 + + + BICOMP + 528 + + + __cstat + 669 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 441 604 121 64 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 358 + + + BICOMP + 325 + + + __cstat + 810 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 121 + + + BICOMP + 157 217 604 441 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 642 + + + BICOMP + 756 + + + __cstat + 621 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 136 + + + BICOMP + 136 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 339 + + + BICOMP + 405 + + + __cstat + 819 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 121 + + + BICOMP + 157 217 604 441 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 758 + + + BICOMP + 794 + + + __cstat + 430 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 + + + BICOMP + 604 274 120 157 441 64 136 332 780 450 304 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 892 + + + BICOMP + 40 + + + __cstat + 793 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 121 + + + BICOMP + 441 157 604 120 64 121 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 723 + + + BICOMP + 46 + + + __cstat + 686 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 121 + + + BICOMP + 121 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 754 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 462 + + + BICOMP + 337 + + + __cstat + 649 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 409 + + + BICOMP + 744 + + + __cstat + 683 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 157 332 477 217 450 564 604 64 120 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 319 + + + BICOMP + 434 + + + __cstat + 422 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 274 308 131 780 64 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 931 + + + BICOMP + 445 + + + __cstat + 829 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 138 + + + BICOMP + 780 450 217 304 64 138 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 482 + + + BICOMP + 578 + + + __cstat + 839 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 274 308 131 780 64 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 637 + + + BICOMP + 360 + + + __cstat + 704 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 908 + + + BICOMP + 7 + + + __cstat + 521 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 136 120 181 121 131 84 138 65 81 + + + BICOMP + 121 65 780 217 120 84 157 274 308 64 136 181 131 138 81 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 438 + + + BICOMP + 873 + + + __cstat + 796 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 + + + BICOMP + 604 441 136 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 732 + + + BICOMP + 786 + + + __cstat + 752 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 837 + + + BICOMP + 904 + + + __cstat + 364 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 157 304 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 675 + + + BICOMP + 406 + + + __cstat + 404 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 138 + + + BICOMP + 450 157 304 120 780 64 138 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 781 + + + BICOMP + 721 + + + __cstat + 468 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 415 + + + BICOMP + 322 + + + __cstat + 764 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 604 450 181 564 136 332 477 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 507 + + + BICOMP + 885 + + + __cstat + 29 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 138 + + + BICOMP + 157 450 304 120 780 64 138 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 633 + + + BICOMP + 383 + + + __cstat + 380 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 138 + + + BICOMP + 138 332 477 136 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 715 + + + BICOMP + 921 + + + __cstat + 889 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 450 304 138 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 470 + + + BICOMP + 856 + + + __cstat + 836 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 138 + + + BICOMP + 138 780 450 217 304 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 639 + + + BICOMP + 734 + + + __cstat + 417 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 131 + + + BICOMP + 780 217 274 308 64 131 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 372 + + + BICOMP + 674 + + + __cstat + 643 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 450 304 138 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 523 + + + BICOMP + 631 + + + __cstat + 625 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 157 780 217 274 308 64 120 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 442 + + + BICOMP + 331 + + + __cstat + 489 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 274 308 131 780 64 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 25 + + + BICOMP + 444 + + + __cstat + 587 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 157 131 780 217 274 308 64 120 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 760 + + + BICOMP + 323 + + + __cstat + 824 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 131 + + + BICOMP + 780 217 274 308 64 131 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 865 + + + BICOMP + 318 + + + __cstat + 550 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 450 304 138 780 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 296 + + + BICOMP + 795 + + + __cstat + 367 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 217 138 + + + BICOMP + 138 780 450 120 304 64 217 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 841 + + + BICOMP + 520 + + + __cstat + 848 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 131 + + + BICOMP + 274 308 120 157 780 64 131 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 918 + + + BICOMP + 617 + + + __cstat + 676 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 586 + + + BICOMP + 279 + + + __cstat + 692 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 646 + + + BICOMP + 28 + + + __cstat + 460 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 131 + + + BICOMP + 131 780 217 274 308 64 120 157 332 450 564 477 604 304 441 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 362 + + + BICOMP + 8 + + + __cstat + 876 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 472 + + + BICOMP + 798 + + + __cstat + 776 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 780 450 181 304 64 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 640 + + + BICOMP + 717 + + + __cstat + 933 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 157 304 217 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 875 + + + BICOMP + 634 + + + __cstat + 762 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 120 + + + BICOMP + 450 120 304 217 780 64 181 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 844 + + + BICOMP + 357 + + + __cstat + 10 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 157 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 891 + + + BICOMP + 456 + + + __cstat + 14 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 + + + BICOMP + 780 450 181 157 304 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 645 + + + BICOMP + 803 + + + __cstat + 12 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 181 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 349 + + + BICOMP + 56 + + + __cstat + 503 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 157 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 513 + + + BICOMP + 388 + + + __cstat + 630 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 619 + + + BICOMP + 792 + + + __cstat + 272 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 780 64 181 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 276 + + + BICOMP + 563 + + + __cstat + 779 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 737 + + + BICOMP + 459 + + + __cstat + 763 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 815 + + + BICOMP + 928 + + + __cstat + 661 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 157 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 660 + + + BICOMP + 719 + + + __cstat + 55 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 136 + + + BICOMP + 136 217 604 441 64 120 157 304 780 450 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 797 + + + BICOMP + 830 + + + __cstat + 606 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 157 780 64 120 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 423 + + + BICOMP + 655 + + + __cstat + 666 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 157 450 604 564 120 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 880 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 300 + + + BICOMP + 5 + + + __cstat + 23 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 + + + BICOMP + 450 304 217 780 64 181 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 335 + + + BICOMP + 416 + + + __cstat + 518 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 217 + + + BICOMP + 450 217 304 181 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 389 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 376 + + + BICOMP + 942 + + + __cstat + 490 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 478 + + + BICOMP + 443 + + + __cstat + 504 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 753 + + + BICOMP + 538 + + + __cstat + 448 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 157 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 766 + + + BICOMP + 567 + + + __cstat + 39 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 450 604 564 120 332 477 64 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 519 + + + BICOMP + 573 + + + __cstat + 487 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 157 450 604 564 120 332 477 64 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 748 + + + BICOMP + 312 + + + __cstat + 555 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 332 477 217 450 564 604 64 120 157 274 780 308 304 441 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 469 + + + BICOMP + 945 + + + __cstat + 347 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 181 120 + + + BICOMP + 450 120 157 304 217 780 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 391 + + + BICOMP + 384 + + + __cstat + 852 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 181 + + + BICOMP + 450 181 304 217 780 64 120 157 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 665 + + + BICOMP + 808 + + + __cstat + 632 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 780 450 120 157 304 64 181 604 441 274 332 564 477 308 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 427 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 382 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 315 + + + BICOMP + 727 + + + __cstat + 20 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 543 + + + BICOMP + 765 + + + __cstat + 342 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 392 + + + BICOMP + 37 + + + __cstat + 747 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 877 + + + BICOMP + 594 + + + __cstat + 345 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 497 + + + BICOMP + 51 + + + __cstat + 350 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 340 + + + BICOMP + 512 + + + __cstat + 598 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 65 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 900 + + + BICOMP + 894 + + + __cstat + 613 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 65 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 466 + + + BICOMP + 652 + + + __cstat + 271 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 65 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 580 + + + BICOMP + 667 + + + __cstat + 725 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 615 + + + BICOMP + 789 + + + __cstat + 267 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 648 + + + BICOMP + 854 + + + __cstat + 1 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 556 + + + BICOMP + 742 + + + __cstat + 495 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 498 + + + BICOMP + 822 + + + __cstat + 310 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 878 + + + BICOMP + 882 + + + __cstat + 525 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 65 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 614 + + + BICOMP + 508 + + + __cstat + 33 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 291 + + + BICOMP + 374 + + + __cstat + 626 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 65 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 726 + + + BICOMP + 888 + + + __cstat + 811 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 81 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 817 + + + BICOMP + 782 + + + __cstat + 278 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 81 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 571 + + + BICOMP + 344 + + + __cstat + 485 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 81 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 387 + + + BICOMP + 735 + + + __cstat + 324 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 81 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 927 + + + BICOMP + 298 + + + __cstat + 299 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 81 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 901 + + + BICOMP + 412 + + + __cstat + 534 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 65 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 65 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 576 + + + BICOMP + 612 + + + __cstat + 60 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 707 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 526 + + + BICOMP + 546 + + + __cstat + 297 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 874 + + + BICOMP + 411 + + + __cstat + 805 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 120 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 883 + + + BICOMP + 944 + + + __cstat + 757 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 217 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 217 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 320 + + + BICOMP + 551 + + + __cstat + 851 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 480 + + + BICOMP + 311 + + + __cstat + 290 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 455 + + + BICOMP + 305 + + + __cstat + 913 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 736 + + + BICOMP + 27 + + + __cstat + 452 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 866 + + + BICOMP + 351 + + + __cstat + 553 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 588 + + + BICOMP + 678 + + + __cstat + 449 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 121 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 654 + + + BICOMP + 947 + + + __cstat + 777 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 897 + + + BICOMP + 511 + + + __cstat + 24 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 138 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 663 + + + BICOMP + 922 + + + __cstat + 590 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 465 + + + BICOMP + 907 + + + __cstat + 867 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 481 + + + BICOMP + 294 + + + __cstat + 870 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 835 + + + BICOMP + 859 + + + __cstat + 887 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 138 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 440 + + + BICOMP + 724 + + + __cstat + 635 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 292 + + + BICOMP + 9 + + + __cstat + 491 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 84 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 540 + + + BICOMP + 600 + + + __cstat + 559 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 136 138 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 593 + + + BICOMP + 938 + + + __cstat + 58 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 84 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 379 + + + BICOMP + 436 + + + __cstat + 706 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 862 + + + BICOMP + 425 + + + __cstat + 49 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 121 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 509 + + + BICOMP + 17 + + + __cstat + 2 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 84 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 544 + + + BICOMP + 41 + + + __cstat + 591 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 84 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 561 + + + BICOMP + 682 + + + __cstat + 461 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 181 120 131 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 672 + + + BICOMP + 451 + + + __cstat + 327 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 138 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 799 + + + BICOMP + 373 + + + __cstat + 828 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 121 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 437 + + + BICOMP + 570 + + + __cstat + 16 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 121 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 121 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 902 + + + BICOMP + 620 + + + __cstat + 281 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 81 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 81 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 720 + + + BICOMP + 932 + + + __cstat + 31 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 84 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 334 + + + BICOMP + 54 + + + __cstat + 740 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 138 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 790 + + + BICOMP + 557 + + + __cstat + 935 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 138 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 138 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 48 + + + BICOMP + 301 + + + __cstat + 575 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 84 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 84 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 53 + + + BICOMP + 869 + + + __cstat + 939 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 831 + + + BICOMP + 381 + + + __cstat + 562 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 909 + + + BICOMP + 494 + + + __cstat + 946 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 421 + + + BICOMP + 809 + + + __cstat + 264 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 120 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 120 131 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 59 + + + BICOMP + 879 + + + __cstat + 36 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 131 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 131 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 568 + + + BICOMP + 303 + + + __cstat + 825 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 636 + + + BICOMP + 309 + + + __cstat + 402 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 714 + + + BICOMP + 821 + + + __cstat + 583 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 426 + + + BICOMP + 813 + + + __cstat + 419 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 943 + + + BICOMP + 50 + + + __cstat + 63 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 471 + + + BICOMP + 393 + + + __cstat + 801 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 527 + + + BICOMP + 864 + + + __cstat + 788 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 418 + + + BICOMP + 853 + + + __cstat + 924 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 302 + + + BICOMP + 476 + + + __cstat + 547 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 52 + + + BICOMP + 579 + + + __cstat + 838 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 343 + + + BICOMP + 501 + + + __cstat + 401 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 698 + + + BICOMP + 435 + + + __cstat + 884 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 64 157 827 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 597 + + + BICOMP + 624 + + + __cstat + 454 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 11 + + + BICOMP + 577 + + + __cstat + 515 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 396 + + + BICOMP + 558 + + + __cstat + 378 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 181 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 903 + + + BICOMP + 849 + + + __cstat + 912 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 120 181 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 457 + + + BICOMP + 712 + + + __cstat + 533 + + + + + ICCARM + 64 157 274 780 450 564 818 477 604 441 304 308 332 136 120 181 + + + BICOMP + 64 157 274 780 450 564 477 329 293 604 304 308 332 136 120 181 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 64 157 739 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 64 157 629 486 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 64 157 629 486 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 64 157 486 355 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 64 157 355 486 629 739 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 64 157 705 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 64 157 827 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 64 157 61 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 64 157 355 486 629 705 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 64 157 505 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 64 157 355 486 629 685 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 64 157 355 486 629 61 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 64 157 355 486 629 827 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 64 157 486 685 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 64 157 355 486 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 64 157 486 629 355 61 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 64 157 486 705 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 3 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 64 157 355 486 629 739 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 656 673 21 473 644 651 834 934 750 15 552 857 858 545 35 356 812 784 420 773 910 433 535 43 492 893 428 833 863 861 530 633 908 415 438 1007 675 296 732 837 931 865 715 372 781 507 470 841 639 918 586 523 760 442 319 482 646 25 637 273 847 892 541 823 845 339 275 899 820 338 723 358 589 754 642 701 409 608 462 758 370 738 755 872 407 584 424 496 806 797 376 660 427 766 478 753 880 737 519 748 423 469 389 875 276 335 391 665 382 362 300 619 472 640 349 815 844 891 645 513 707 480 648 392 320 580 615 576 883 556 526 614 874 315 497 543 877 498 340 901 900 466 878 291 387 726 927 817 571 902 292 593 509 544 48 720 897 334 672 790 835 540 561 53 663 831 440 909 421 379 59 437 862 588 799 455 736 866 654 465 481 418 52 527 714 426 903 597 698 636 11 943 396 457 302 471 568 343 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 64 157 355 486 629 505 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 348 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 385 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 64 157 355 486 629 61 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 64 157 685 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 64 157 486 505 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 64 157 685 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 64 157 827 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 64 157 355 486 629 685 505 739 827 705 61 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 64 157 629 486 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 64 157 486 355 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 64 157 61 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 64 157 355 486 629 705 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 64 157 505 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 64 157 486 629 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 64 157 486 629 705 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 263 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 64 157 486 739 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 64 157 355 486 629 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 64 157 486 629 61 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 64 157 739 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 64 157 486 827 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 64 157 486 629 739 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 64 157 486 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 64 157 486 629 685 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 64 157 629 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 64 157 486 629 505 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 64 157 355 486 629 827 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 64 157 486 61 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 64 157 486 629 827 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 545 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 35 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 656 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 473 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 750 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 673 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 651 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 934 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 644 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 834 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 552 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 15 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 858 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 857 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 21 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 865 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 715 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 372 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 356 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 1007 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 507 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 773 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 428 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 492 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 784 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 530 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 732 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 863 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 296 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1041 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 415 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 837 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 438 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 535 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 675 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 931 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 433 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 910 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 43 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 781 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 470 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 861 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 812 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 893 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 420 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 833 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 908 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1044 1052 1043 1040 1039 1045 1051 1047 1049 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 389 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 589 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 633 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1051 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 755 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 407 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 427 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 738 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 370 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 872 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 880 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 707 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 382 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 754 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 790 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 540 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 835 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 379 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 59 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 544 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 53 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 588 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 455 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 736 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 831 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 909 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 897 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 720 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 672 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 799 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 509 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 866 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 862 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 437 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 48 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 654 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 663 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 465 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 334 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1051 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 481 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 418 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 52 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 440 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 421 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 561 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1043 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 541 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 760 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 319 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 892 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 841 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 823 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 845 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 701 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 646 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 409 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 820 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 608 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 462 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 273 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 275 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 918 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 339 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 442 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 637 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 482 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 358 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 642 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1044 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 758 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 523 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 338 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 723 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 899 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 639 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 25 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 586 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1039 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 847 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1040 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 726 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 340 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 497 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 315 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 902 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 593 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 580 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 556 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 900 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 874 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 466 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 480 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 320 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 576 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 883 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 387 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 571 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 648 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 614 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 292 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1045 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 615 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 877 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 526 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 392 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 927 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 878 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 498 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 817 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1049 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 543 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 291 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 901 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 1047 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 766 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 806 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 335 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 1041 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 469 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 478 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 584 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 519 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 748 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 660 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1044 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 423 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 300 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 619 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 645 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 797 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 362 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 640 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 815 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 891 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 376 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 472 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 844 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 424 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 665 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 875 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 513 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 496 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 737 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 391 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 753 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 276 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 349 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1041 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 698 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 568 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 343 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 527 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 302 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 471 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 457 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1044 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 426 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 396 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 903 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 1043 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 597 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 636 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 943 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 714 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 11 + + + + + ICCARM + 1046 0 274 780 450 564 818 477 604 441 304 308 332 1050 1048 1052 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r4/iar/example_build/tx.ewd b/ports/cortex_r4/iar/example_build/tx.ewd new file mode 100644 index 00000000..49662d42 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r4/iar/example_build/tx.ewp b/ports/cortex_r4/iar/example_build/tx.ewp new file mode 100644 index 00000000..72f432f8 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.ewp @@ -0,0 +1,2764 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r4/iar/example_build/tx.ewt b/ports/cortex_r4/iar/example_build/tx.ewt new file mode 100644 index 00000000..016f76bc --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx.ewt @@ -0,0 +1,3415 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r4/iar/example_build/tx_initialize_low_level.s b/ports/cortex_r4/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..a05d79d1 --- /dev/null +++ b/ports/cortex_r4/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,277 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore + +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif + + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + ARM + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + CPS #SVC_MODE ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + BX lr ; Return to caller +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return + PUBLIC IRQ_Handler +__tx_irq_handler +IRQ_Handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +; /* FIQ Handler */ + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_r4/iar/inc/tx_port.h b/ports/cortex_r4/iar/inc/tx_port.h new file mode 100644 index 00000000..362edaf5 --- /dev/null +++ b/ports/cortex_r4/iar/inc/tx_port.h @@ -0,0 +1,380 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R4/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 1 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_IRQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-R4. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R4/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + diff --git a/ports/cortex_r4/iar/readme_threadx.txt b/ports/cortex_r4/iar/readme_threadx.txt new file mode 100644 index 00000000..dbf6f32b --- /dev/null +++ b/ports/cortex_r4/iar/readme_threadx.txt @@ -0,0 +1,426 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R4 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-R4 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-R4 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R4 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R4 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R4 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R4 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of a thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +ThreadX management of FIQ interrupts is not provided because FIQ interrupts +cannot be disabled. The hardware does not support nested FIQ interrupts. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-R4 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R4 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version 6.0.1 for Cortex-R4 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r4/iar/src/tx_iar.c b/ports/cortex_r4/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_r4/iar/src/tx_thread_context_restore.s b/ports/cortex_r4/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..eb9c7446 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_context_restore.s @@ -0,0 +1,247 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + +SVC_MODE DEFINE 0x13 ; SVC mode +IRQ_MODE DEFINE 0x12 ; IRQ mode +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +THUMB_MASK DEFINE 0x20 ; Thumb bit mask + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + ARM +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + CPSID i ; Disable IRQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + CPS #SVC_MODE ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + CPS #IRQ_MODE ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + CPS #SVC_MODE ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + CPS #SVC_MODE ; Enter SVC mode + + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_context_save.s b/ports/cortex_r4/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..9c28acb1 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_context_save.s @@ -0,0 +1,198 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + ARM +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_interrupt_control.s b/ports/cortex_r4/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..934de0dd --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + +INT_MASK DEFINE 0x80 ; Interrupt bit mask +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + ARM +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + + BX lr ; Return to caller +; +;} +; +; + END diff --git a/ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..64c26b4b --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,89 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + ARM +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR + CPSID i ; Mask interrupts + BX lr ; Return to caller +;} +; +; + END diff --git a/ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..f128b115 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + ARM +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR + + BX lr ; Return to caller +;} +; + END diff --git a/ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..04bc7792 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_MODE DEFINE 0x12 ; IRQ mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + ARM +_tx_thread_irq_nesting_end + MOV r3, lr ; Save ISR return address + CPSID i ; Disable interrupts + POP {lr} ; Pickup saved lr + CPS #IRQ_MODE ; Switch to IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..21dc597b --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SYS_MODE DEFINE 0x1F ; System mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + ARM +_tx_thread_irq_nesting_start + MOV r3, lr ; Save ISR return address + CPS #SYS_MODE ; Enter SYS mode + PUSH {lr} ; Save system mode lr on the system mode stack + CPSIE i ; Enable interrupts + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_schedule.s b/ports/cortex_r4/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..58092c84 --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_schedule.s @@ -0,0 +1,220 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + ARM +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + CPSIE i ; Enable IRQ interrupts + +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + CPSID i ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR + + BX lr ; Return to caller +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_stack_build.s b/ports/cortex_r4/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..253006fc --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_stack_build.s @@ -0,0 +1,151 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + ARM +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R4 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_system_return.s b/ports/cortex_r4/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..c0014a8b --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_system_return.s @@ -0,0 +1,155 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + ARM +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR + CPSID i ; Disable interrupts +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..07b5cc5f --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,184 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + ARM +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_r4/iar/src/tx_timer_interrupt.s b/ports/cortex_r4/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..420e42ad --- /dev/null +++ b/ports/cortex_r4/iar/src/tx_timer_interrupt.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R4/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + ARM +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + BX lr ; Return to caller +; +;} + END + diff --git a/ports/cortex_r5/ac5/example_build/build_threadx.bat b/ports/cortex_r5/ac5/example_build/build_threadx.bat new file mode 100644 index 00000000..c30b6643 --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +armasm -g --cpu=cortex-r5 --apcs=interwork tx_initialize_low_level.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_stack_build.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_schedule.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_system_return.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_context_save.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_context_restore.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_interrupt_control.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_timer_interrupt.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_context_restore.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_context_save.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_nesting_end.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_fiq_nesting_start.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_interrupt_disable.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_interrupt_restore.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_irq_nesting_end.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_irq_nesting_start.s +armasm -g --cpu=cortex-r5 --apcs=interwork ../src/tx_thread_vectored_context_save.s +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +armcc -g --cpu=cortex-r5 -c -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +armar --create tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +armar -r tx.a tx_initialize_low_level.o tx_thread_fiq_context_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_end.o tx_thread_fiq_nesting_start.o tx_thread_interrupt_disable.o +armar -r tx.a tx_thread_interrupt_restore.o tx_thread_irq_nesting_end.o tx_thread_irq_nesting_start.o +armar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +armar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +armar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +armar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +armar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +armar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +armar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +armar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +armar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +armar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +armar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +armar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +armar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +armar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +armar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +armar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +armar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +armar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +armar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +armar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +armar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +armar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +armar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +armar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +armar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +armar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +armar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +armar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +armar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +armar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +armar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +armar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +armar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r5/ac5/example_build/build_threadx_sample.bat b/ports/cortex_r5/ac5/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..3adb3bab --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/build_threadx_sample.bat @@ -0,0 +1,4 @@ +armasm -g --cpu=cortex-r5 --apcs=interwork tx_initialize_low_level.s +armcc -c -g --cpu=cortex-r5 -I../../../../common/inc -I../inc sample_threadx.c +armlink -d -o sample_threadx.axf --elf --map --ro-base=0x00000000 --rw-base=0x20000000 --first tx_initialize_low_level.o(Init) --datacompressor=off --inline --info=inline --callgraph --list sample_threadx.map tx_initialize_low_level.o sample_threadx.o tx.a + diff --git a/ports/cortex_r5/ac5/example_build/sample_threadx.c b/ports/cortex_r5/ac5/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s b/ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..b4cbb423 --- /dev/null +++ b/ports/cortex_r5/ac5/example_build/tx_initialize_low_level.s @@ -0,0 +1,394 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +FIQ_MODE EQU 0xD1 ; FIQ mode +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode +SYS_MODE EQU 0xDF ; SYS mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +FIQ_MODE EQU 0x91 ; FIQ mode +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode +SYS_MODE EQU 0x9F ; SYS mode + ENDIF +HEAP_SIZE EQU 4096 ; Heap size +FIQ_STACK_SIZE EQU 512 ; FIQ stack size +SYS_STACK_SIZE EQU 1024 ; SYS stack size (used for nested interrupts) +IRQ_STACK_SIZE EQU 1024 ; IRQ stack size +; +; + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_initialize_unused_memory + IMPORT _tx_thread_context_save + IMPORT _tx_thread_context_restore + IF :DEF:TX_ENABLE_FIQ_SUPPORT + IMPORT _tx_thread_fiq_context_save + IMPORT _tx_thread_fiq_context_restore + ENDIF + IF :DEF:TX_ENABLE_IRQ_NESTING + IMPORT _tx_thread_irq_nesting_start + IMPORT _tx_thread_irq_nesting_end + ENDIF + IF :DEF:TX_ENABLE_FIQ_NESTING + IMPORT _tx_thread_fiq_nesting_start + IMPORT _tx_thread_fiq_nesting_end + ENDIF + IMPORT _tx_timer_interrupt + IMPORT __main + IMPORT _tx_version_id + IMPORT _tx_build_options + IMPORT |Image$$ZI$$Limit| +; +; + AREA Init, CODE, READONLY +; +;/* Define the default Cortex-R5 vector area. This should be located or copied to 0. */ +; + EXPORT __vectors +__vectors + LDR pc,=__main ; Reset goes to startup function + LDR pc,=__tx_undefined ; Undefined handler + LDR pc,=__tx_swi_interrupt ; Software interrupt handler + LDR pc,=__tx_prefetch_handler ; Prefetch exception handler + LDR pc,=__tx_abort_handler ; Abort exception handler + LDR pc,=__tx_reserved_handler ; Reserved exception handler + LDR pc,=__tx_irq_handler ; IRQ interrupt handler + LDR pc,=__tx_fiq_handler ; FIQ interrupt handler +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + EXPORT _tx_initialize_low_level +_tx_initialize_low_level +; +; +; /****** NOTE ****** We must be in SVC MODE at this point. Some monitors +; enter this routine in USER mode and require a software interrupt to +; change into SVC mode. */ +; + LDR r1, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r1, r2, r1 ; Setup heap limit + ADD r1, r1, #4 ; Setup stack limit +; + IF :DEF:TX_ENABLE_IRQ_NESTING +; /* Setup the system mode stack for nested interrupt support */ + LDR r2, =SYS_STACK_SIZE ; Pickup stack size + MOV r3, #SYS_MODE ; Build SYS mode CPSR + MSR CPSR_c, r3 ; Enter SYS mode + ADD r1, r1, r2 ; Calculate start of SYS stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup SYS stack pointer + ENDIF +; + LDR r2, =FIQ_STACK_SIZE ; Pickup stack size + MOV r0, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r0 ; Enter FIQ mode + ADD r1, r1, r2 ; Calculate start of FIQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup FIQ stack pointer + MOV sl, #0 ; Clear sl + MOV fp, #0 ; Clear fp + LDR r2, =IRQ_STACK_SIZE ; Pickup IRQ (system stack size) + MOV r0, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Enter IRQ mode + ADD r1, r1, r2 ; Calculate start of IRQ stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + MOV sp, r1 ; Setup IRQ stack pointer + MOV r0, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r0 ; Enter SVC mode + LDR r3, =_tx_thread_system_stack_ptr ; Pickup stack pointer + STR r1, [r3, #0] ; Save the system stack +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; + LDR r1, =_tx_thread_system_stack_ptr ; Pickup address of system stack ptr + LDR r0, [r1, #0] ; Pickup system stack + ADD r0, r0, #4 ; Increment to next free word +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) |Image$$ZI$$Limit| + HEAP + [SYS_STACK] + FIQ_STACK + IRQ_STACK; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; +; +;/* Define initial heap/stack routine for the ARM RealView (and ADS) startup code. This +; routine will set the initial stack to use the ThreadX IRQ & FIQ & +; (optionally SYS) stack areas. */ +; + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR r0, =|Image$$ZI$$Limit| ; Get end of non-initialized RAM area + LDR r2, =HEAP_SIZE ; Pickup the heap size + ADD r2, r2, r0 ; Setup heap limit + ADD r3, r2, #4 ; Setup stack limit + MOV r1, r3 ; Setup start of stack + IF :DEF:TX_ENABLE_IRQ_NESTING + LDR r12, =SYS_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + ENDIF + LDR r12, =FIQ_STACK_SIZE ; Pickup FIQ stack size + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + LDR r12, =IRQ_STACK_SIZE ; Pickup IRQ system stack + ADD r1, r1, r12 ; Setup the return system stack + BIC r1, r1, #7 ; Ensure 8-byte alignment + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; +;/* Define shells for each of the interrupt vectors. */ +; + EXPORT __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + EXPORT __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + EXPORT __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + EXPORT __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + EXPORT __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; +; + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; + BL _tx_timer_interrupt ; Timer interrupt handler +_tx_not_timer_interrupt +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start + ENDIF +; +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ + IF :DEF:TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end + ENDIF +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; + EXPORT __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; +; /* Save initial context and call context save to prepare for +; vectored ISR execution. */ +; +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers +; BL _tx_thread_vectored_context_save ; Vectored context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +; ENDIF +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; IF :DEF:TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +; ENDIF +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +; from FIQ mode with interrupts disabled. This routine switches to the +; system mode and returns with FIQ interrupts enabled. +; +; NOTE: It is very important to ensure all FIQ interrupts are cleared +; prior to enabling nested FIQ interrupts. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start + ENDIF +; +; /* Application FIQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_fiq_context_restore. */ + IF :DEF:TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end + ENDIF +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +; +; + ELSE + EXPORT __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler + ENDIF +; +; /* Reference build options and version ID to ensure they come in. */ +; + LDR r2, =_tx_build_options ; Pickup build options variable address + LDR r0, [r2, #0] ; Pickup build options content + LDR r2, =_tx_version_id ; Pickup version ID variable address + LDR r0, [r2, #0] ; Pickup version ID content +; +; + END + diff --git a/ports/cortex_r5/ac5/inc/tx_port.h b/ports/cortex_r5/ac5/inc/tx_port.h new file mode 100644 index 00000000..459a9a94 --- /dev/null +++ b/ports/cortex_r5/ac5/inc/tx_port.h @@ -0,0 +1,327 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R5/AC5 */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef __thumb + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (ULONG) __clz((unsigned int) m); \ + b = 31 - b; +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifndef __thumb + +#define TX_INTERRUPT_SAVE_AREA register unsigned int interrupt_save_disabled; + +#ifdef TX_ENABLE_FIQ_SUPPORT + +/* IRQ and FIQ support. */ + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); \ + __disable_fiq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + __enable_fiq(); \ + } + +#else + +#define TX_DISABLE __memory_changed(), interrupt_save_disabled = __disable_irq(); + +#define TX_RESTORE if (!interrupt_save_disabled) \ + { \ + __enable_irq(); \ + } +#endif + +#else + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R5/AC5 Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_r5/ac5/readme_threadx.txt b/ports/cortex_r5/ac5/readme_threadx.txt new file mode 100644 index 00000000..bc4d497d --- /dev/null +++ b/ports/cortex_r5/ac5/readme_threadx.txt @@ -0,0 +1,529 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R5 + + Thumb & 32-bit Mode + + Using ARM Compiler 5 (AC5) + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the ARM +AC5 development environment. At this point you may run the build_threadx.bat +batch file. This will build the ThreadX run-time environment in the +"example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + +1.1 Building with Project Files + +The ThreadX library can also be built via project files. Simply open +the tx.mcp file with project builder and select make. This will place +the tx.a library file into the Debug sub-directory. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the ARM +Windows-based simulator. + +Building the demonstration is easy; simply execute the build_threadx_demo.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.axf +is a binary file that can be downloaded and executed on the ARM simulator. + +2.0.1 Building with Project Files + +The ThreadX demonstration can also be built via project files. Simply open +the sample_threadx.mcp file with project builder and select make. This will place +the sample_threadx.axf output image into the Debug sub-directory. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R5 using AC5 tools is at label +__main. This is defined within the AC5 compiler's startup code. In +addition, this is where all static and global pre-set C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, the vector area, and a periodic timer interrupt +source. By default, the vector area is defined to be located in the Init area, +which is defined at the top of tx_initialize_low_level.s. This area is typically +located at 0. In situations where this is impossible, the vectors at the beginning +of the Init area should be copied to address 0. + +This is also where initialization of a periodic timer interrupt source +should take place. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application, which is supplied as the sole input +parameter to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler Switch Meaning + + -g Specifies debug information + -c Specifies object code generation + --cpu Cortex-R5 Specifies Cortex-R5 instruction set + --apcs /interwork Specifies Thumb/32-bit compatibility + +Linker Switch Meaning + + -d Specifies to retain debug information in output file + -o demo.axf Specifies demo output file name + --elf Specifies elf output file format + --ro Specifies that Read-Only memory starts at address 0 + --first tx_initialize_low_level.o(Init) + Specifies that the first area loaded is Init + --remove Remove unused areas + --list Specifies map file name + --symbols Specifies symbols for map file + --map Creates a map file + +Application Defines + + --PD "TX_ENABLE_FIQ_SUPPORT SETL {TRUE}" This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + --PD "TX_ENABLE_IRQ_NESTING SETL {TRUE}" This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + --PD "TX_ENABLE_FIQ_NESTING SETL {TRUE}" This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. In addition, + IRQ nesting should also be enabled. + -DTX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + -DTX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + -DTX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + -DTX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + -DTX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + -DTX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + -DTX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + -DTX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + -DTX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + -DTX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + -DTX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + -DTX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + -DTX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + -DTX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + -DTX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + -DTX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + -DTX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + -DTX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + -DTX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + -DTX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + -DTX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + -DTX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + -DTX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + -DTX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +5. Register Usage and Stack Frames + +The AC5 compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the build_threadx.bat file to +remove the -g option and enable all compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R5 vectors start at address zero. The demonstration system startup +Init area contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save ; Jump to the context save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call(s) go here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + EXPORT __tx_irq_example_handler +__tx_irq_example_handler +; +; /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other scratch registers + BL _tx_thread_vectored_context_save ; Call the vectored IRQ context save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no longer required, +calling the _tx_thread_irq_nesting_end service disables nesting by disabling +IRQ interrupts and switching back to IRQ mode in preparation for the IRQ +context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + EXPORT __tx_irq_handler + EXPORT __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* Enable nested IRQ interrupts. NOTE: Since this service returns +; with IRQ interrupts enabled, all IRQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +; +; /* Application ISR call(s) go here! */ +; +; /* Disable nested IRQ interrupts. The mode is switched back to +; IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.s: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Application FIQ handlers can be called here! */ +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + EXPORT __tx_fiq_handler + EXPORT __tx_fiq_processing_return +__tx_fiq_handler +; +; /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return +; +; /* At this point execution is still in the FIQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. */ +; +; /* Enable nested FIQ interrupts. NOTE: Since this service returns +; with FIQ interrupts enabled, all FIQ interrupt sources must be +; cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +; +; /* Application FIQ handlers can be called here! */ +; +; /* Disable nested FIQ interrupts. The mode is switched back to +; FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +; +; /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.s in the Integrator sub-directories. + + +9. Thumb/Cortex-R5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. If any Thumb code +is used the entire ThreadX source- both C and assembly - should be built +with the "-apcs /interwork" option. + + +10. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R5 using AC5 tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r5/ac5/src/tx_thread_context_restore.s b/ports/cortex_r5/ac5/src/tx_thread_context_restore.s new file mode 100644 index 00000000..1a1e3c0c --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_context_restore.s @@ -0,0 +1,255 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts +IRQ_MODE EQU 0xD2 ; IRQ mode +SVC_MODE EQU 0xD3 ; SVC mode + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts +IRQ_MODE EQU 0x92 ; IRQ mode +SVC_MODE EQU 0x93 ; SVC mode + ENDIF +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + EXPORT _tx_thread_context_restore +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3, #0] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3, #0] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3, #0] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #IRQ_MODE ; Build IRQ mode CPSR + MSR CPSR_c, r2 ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save + ENDIF + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3, #0] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1, #0] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + MOV r3, #SVC_MODE ; Build SVC mode with interrupts disabled + MSR CPSR_c, r3 ; Change to SVC mode + B _tx_thread_schedule ; Return to scheduler +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_context_save.s b/ports/cortex_r5/ac5/src/tx_thread_context_save.s new file mode 100644 index 00000000..d7d5d406 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_context_save.s @@ -0,0 +1,199 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_irq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + EXPORT _tx_thread_context_save +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s new file mode 100644 index 00000000..c80122bb --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_restore.s @@ -0,0 +1,245 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE EQU 0xD3 ; SVC mode +FIQ_MODE EQU 0xD1 ; FIQ mode +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT _tx_thread_system_stack_ptr + IMPORT _tx_thread_execute_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IMPORT _tx_thread_preempt_disable + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_restore Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the fiq interrupt context when processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* FIQ ISR Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_context_restore(VOID) +;{ + EXPORT _tx_thread_fiq_context_restore +_tx_thread_fiq_context_restore +; +; /* Lockout interrupts. */ +; + CPSID if ; Disable IRQ and FIQ interrupts + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function + ENDIF +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_fiq_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, [sp] ; Pickup the saved SPSR + MOV r2, #MODE_MASK ; Build mask to isolate the interrupted mode + AND r1, r1, r2 ; Isolate mode bits + CMP r1, #IRQ_MODE_BITS ; Was an interrupt taken in IRQ mode before we + ; got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore ; Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore ; Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_fiq_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore ; No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_fiq_preempt_restore +; + LDMIA sp!, {r3, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + MOV r2, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r2 ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + MOV r2, #FIQ_MODE ; Build FIQ mode CPSR + MSR CPSR_c, r2 ; Re-enter FIQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOV r5, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r5 ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_fiq_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_fiq_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_fiq_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + ADD sp, sp, #24 ; Recover FIQ stack space + MOV r3, #SVC_MODE ; Build SVC mode CPSR + MSR CPSR_c, r3 ; Enter SVC mode + B _tx_thread_schedule ; Return to scheduler +; +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s new file mode 100644 index 00000000..d3fceec4 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_context_save.s @@ -0,0 +1,203 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IMPORT __tx_fiq_processing_return + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_context_save Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +; VOID _tx_thread_fiq_context_save(VOID) +;{ + EXPORT _tx_thread_fiq_context_save +_tx_thread_fiq_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +__tx_thread_fiq_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_fiq_idle_system_save ; If so, interrupt occurred in +; ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, lr} ; Store other registers, Note that we don't +; ; need to save sl and ip since FIQ has +; ; copies of these registers. Nested +; ; interrupt processing does need to save +; ; these registers. +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +; else +; { +; +__tx_thread_fiq_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF +; +; /* Not much to do here, save the current SPSR and LR for possible +; use in IRQ interrupted in idle system conditions, and return to +; FIQ interrupt processing. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, lr} ; Store other registers that will get used +; ; or stripped off the stack in context +; ; restore + B __tx_fiq_processing_return ; Continue FIQ processing +; +; } +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s new file mode 100644 index 00000000..0bfad1ba --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_end.s @@ -0,0 +1,111 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +FIQ_MODE_BITS EQU 0x11 ; FIQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_end Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +;/* processing from system mode back to FIQ mode prior to the ISR */ +;/* calling _tx_thread_fiq_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_end(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_end +_tx_thread_fiq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s new file mode 100644 index 00000000..fc9c725e --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_fiq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +FIQ_DISABLE EQU 0x40 ; FIQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_fiq_nesting_start Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from FIQ mode after */ +;/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +;/* processing to the system mode so nested FIQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with FIQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_fiq_nesting_start(VOID) +;{ + EXPORT _tx_thread_fiq_nesting_start +_tx_thread_fiq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE ; Build enable FIQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s b/ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..856eae8d --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_interrupt_control.s @@ -0,0 +1,102 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +INT_MASK EQU 0xC0 ; Interrupt bit mask + ELSE +INT_MASK EQU 0x80 ; Interrupt bit mask + ENDIF +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + EXPORT _tx_thread_interrupt_control +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s b/ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..f558daa3 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_interrupt_disable.s @@ -0,0 +1,95 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(void) +;{ + EXPORT _tx_thread_interrupt_disable +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR +; +; /* Mask interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ + ELSE + CPSID i ; Disable IRQ + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s b/ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..e0b1e8ef --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_interrupt_restore.s @@ -0,0 +1,87 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_restore(UINT old_posture) +;{ + EXPORT _tx_thread_interrupt_restore +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_c, r0 ; Setup new CPSR + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..67a6526d --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,110 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS EQU 0xC0 ; Disable IRQ & FIQ interrupts + ELSE +DISABLE_INTS EQU 0x80 ; Disable IRQ interrupts + ENDIF +MODE_MASK EQU 0x1F ; Mode mask +IRQ_MODE_BITS EQU 0x12 ; IRQ mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + EXPORT _tx_thread_irq_nesting_end +_tx_thread_irq_nesting_end + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + ORR r0, r0, #DISABLE_INTS ; Build disable interrupt value + MSR CPSR_c, r0 ; Disable interrupts + LDMIA sp!, {r1, lr} ; Pickup saved lr (and r1 throw-away for + ; 8-byte alignment logic) + BIC r0, r0, #MODE_MASK ; Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS ; Build IRQ mode CPSR + MSR CPSR_c, r0 ; Re-enter IRQ mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..9096f016 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,104 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +IRQ_DISABLE EQU 0x80 ; IRQ disable bit +MODE_MASK EQU 0x1F ; Mode mask +SYS_MODE_BITS EQU 0x1F ; System mode bits +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + EXPORT _tx_thread_irq_nesting_start +_tx_thread_irq_nesting_start + MOV r3,lr ; Save ISR return address + MRS r0, CPSR ; Pickup the CPSR + BIC r0, r0, #MODE_MASK ; Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS ; Build system mode CPSR + MSR CPSR_c, r0 ; Enter system mode + STMDB sp!, {r1, lr} ; Push the system mode lr on the system mode stack + ; and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE ; Build enable IRQ CPSR + MSR CPSR_c, r0 ; Enter system mode + IF {INTER} = {TRUE} + BX r3 ; Return to caller + ELSE + MOV pc, r3 ; Return to caller + ENDIF +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_schedule.s b/ports/cortex_r5/ac5/src/tx_thread_schedule.s new file mode 100644 index 00000000..f4857766 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_schedule.s @@ -0,0 +1,233 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_execute_ptr + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + EXPORT _tx_thread_schedule +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSIE if ; Enable IRQ and FIQ interrupts + ELSE + CPSIE i ; Enable IRQ interrupts + ENDIF +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + BL _tx_execution_thread_enter ; Call the thread execution enter function + ENDIF +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore + ENDIF + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return + IF {TARGET_FPU_VFP} = {TRUE} + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore + ENDIF + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} +; + + IF {TARGET_FPU_VFP} = {TRUE} + EXPORT tx_thread_vfp_enable +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + EXPORT tx_thread_vfp_disable +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Enable IRQ and FIQ interrupts + ELSE + CPSID i ; Enable IRQ interrupts + ENDIF + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + ENDIF + + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_stack_build.s b/ports/cortex_r5/ac5/src/tx_thread_stack_build.s new file mode 100644 index 00000000..26281be6 --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_stack_build.s @@ -0,0 +1,164 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE EQU 0x13 ; SVC mode + IF :DEF:TX_ENABLE_FIQ_SUPPORT +CPSR_MASK EQU 0xDF ; Mask initial CPSR, IRQ & FIQ ints enabled + ELSE +CPSR_MASK EQU 0x9F ; Mask initial CPSR, IRQ ints enabled + ENDIF + +THUMB_BIT EQU 0x20 ; Thumb-bit + +; +; + AREA ||.text||, CODE, READONLY +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + EXPORT _tx_thread_stack_build +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + + MRS r3, CPSR ; Pickup CPSR + BIC r3, r3, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r3, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + BIC r3, r3, #THUMB_BIT ; Clear Thumb-bit by default + AND r1, r1, #1 ; Determine if the entry function is in Thumb mode + CMP r1, #1 ; Is the Thumb-bit set? + ORREQ r3, r3, #THUMB_BIT ; Yes, set the Thumb-bit + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +;} + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_system_return.s b/ports/cortex_r5/ac5/src/tx_thread_system_return.s new file mode 100644 index 00000000..5ecd61fd --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_system_return.s @@ -0,0 +1,158 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + IMPORT _tx_thread_current_ptr + IMPORT _tx_timer_time_slice + IMPORT _tx_thread_schedule + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_thread_exit + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + EXPORT _tx_thread_system_return +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ELSE + CPSID i ; Disable IRQ interrupts + ENDIF +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + + IF {TARGET_FPU_VFP} = {TRUE} + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save + ENDIF + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function + ENDIF + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s b/ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..77015e9a --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_thread_vectored_context_save.s @@ -0,0 +1,200 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + IMPORT _tx_thread_system_state + IMPORT _tx_thread_current_ptr + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY + IMPORT _tx_execution_isr_enter + ENDIF +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + EXPORT _tx_thread_vectored_context_save +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + IF :DEF:TX_ENABLE_FIQ_SUPPORT + CPSID if ; Disable IRQ and FIQ interrupts + ENDIF + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occurred in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + + IF :DEF:TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr + ENDIF + + ADD sp, sp, #32 ; Recover saved registers + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +; } +;} +; + END + diff --git a/ports/cortex_r5/ac5/src/tx_timer_interrupt.s b/ports/cortex_r5/ac5/src/tx_timer_interrupt.s new file mode 100644 index 00000000..d498e16f --- /dev/null +++ b/ports/cortex_r5/ac5/src/tx_timer_interrupt.s @@ -0,0 +1,258 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + IMPORT _tx_timer_time_slice + IMPORT _tx_timer_system_clock + IMPORT _tx_timer_current_ptr + IMPORT _tx_timer_list_start + IMPORT _tx_timer_list_end + IMPORT _tx_timer_expired_time_slice + IMPORT _tx_timer_expired + IMPORT _tx_thread_time_slice + IMPORT _tx_timer_expiration_process +; +; + AREA ||.text||, CODE, READONLY + PRESERVE8 +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R5/AC5 */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + EXPORT _tx_timer_interrupt +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + IF {INTER} = {TRUE} + BX lr ; Return to caller + ELSE + MOV pc, lr ; Return to caller + ENDIF +; +;} + END + diff --git a/ports/cortex_r5/gnu/example_build/build_threadx.bat b/ports/cortex_r5/gnu/example_build/build_threadx.bat new file mode 100644 index 00000000..210b9999 --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/build_threadx.bat @@ -0,0 +1,238 @@ +del tx.a +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_stack_build.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_schedule.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_system_return.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_interrupt_control.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_timer_interrupt.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_interrupt_disable.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_interrupt_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_irq_nesting_start.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_irq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_nesting_end.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_fiq_context_restore.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 ../src/tx_thread_vectored_context_save.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_pool_search.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_high_level.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_enter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_initialize_kernel_setup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_cleanup.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_identify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_shell_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_sleep.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_analyze.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_handler.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_stack_error_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_preempt_check.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_system_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_timeout.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_time_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_expiration_process.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_performance_system_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_system_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_timer_thread_entry.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_enable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_disable.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_initialize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_interrupt_control.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_enter_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_isr_exit_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_register.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_object_unregister.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_user_event_insert.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_buffer_full_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_filter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/tx_trace_event_unfilter.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_block_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_allocate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_pool_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_byte_release.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_event_flags_set_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_mutex_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_flush.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_front_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_receive.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_queue_send_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_ceiling_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_prioritize.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_semaphore_put_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_entry_exit_notify.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_info_get.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_preemption_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_priority_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_relinquish.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_reset.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_resume.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_suspend.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_terminate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_time_slice_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_thread_wait_abort.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_activate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_change.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_create.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_deactivate.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_delete.c +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc ../../../../common/src/txe_timer_info_get.c +arm-none-eabi-ar -r tx.a tx_thread_stack_build.o tx_thread_schedule.o tx_thread_system_return.o tx_thread_context_save.o tx_thread_context_restore.o tx_timer_interrupt.o tx_thread_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_thread_interrupt_disable.o tx_thread_interrupt_restore.o tx_thread_fiq_context_save.o tx_thread_fiq_nesting_start.o tx_thread_irq_nesting_start.o tx_thread_irq_nesting_end.o +arm-none-eabi-ar -r tx.a tx_thread_fiq_nesting_end.o tx_thread_fiq_context_restore.o tx_thread_vectored_context_save.o tx_initialize_low_level.o +arm-none-eabi-ar -r tx.a tx_block_allocate.o tx_block_pool_cleanup.o tx_block_pool_create.o tx_block_pool_delete.o tx_block_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_block_pool_initialize.o tx_block_pool_performance_info_get.o tx_block_pool_performance_system_info_get.o tx_block_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_block_release.o tx_byte_allocate.o tx_byte_pool_cleanup.o tx_byte_pool_create.o tx_byte_pool_delete.o tx_byte_pool_info_get.o +arm-none-eabi-ar -r tx.a tx_byte_pool_initialize.o tx_byte_pool_performance_info_get.o tx_byte_pool_performance_system_info_get.o tx_byte_pool_prioritize.o +arm-none-eabi-ar -r tx.a tx_byte_pool_search.o tx_byte_release.o tx_event_flags_cleanup.o tx_event_flags_create.o tx_event_flags_delete.o tx_event_flags_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_info_get.o tx_event_flags_initialize.o tx_event_flags_performance_info_get.o tx_event_flags_performance_system_info_get.o +arm-none-eabi-ar -r tx.a tx_event_flags_set.o tx_event_flags_set_notify.o tx_initialize_high_level.o tx_initialize_kernel_enter.o tx_initialize_kernel_setup.o +arm-none-eabi-ar -r tx.a tx_mutex_cleanup.o tx_mutex_create.o tx_mutex_delete.o tx_mutex_get.o tx_mutex_info_get.o tx_mutex_initialize.o tx_mutex_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_mutex_performance_system_info_get.o tx_mutex_prioritize.o tx_mutex_priority_change.o tx_mutex_put.o tx_queue_cleanup.o tx_queue_create.o +arm-none-eabi-ar -r tx.a tx_queue_delete.o tx_queue_flush.o tx_queue_front_send.o tx_queue_info_get.o tx_queue_initialize.o tx_queue_performance_info_get.o +arm-none-eabi-ar -r tx.a tx_queue_performance_system_info_get.o tx_queue_prioritize.o tx_queue_receive.o tx_queue_send.o tx_queue_send_notify.o tx_semaphore_ceiling_put.o +arm-none-eabi-ar -r tx.a tx_semaphore_cleanup.o tx_semaphore_create.o tx_semaphore_delete.o tx_semaphore_get.o tx_semaphore_info_get.o tx_semaphore_initialize.o +arm-none-eabi-ar -r tx.a tx_semaphore_performance_info_get.o tx_semaphore_performance_system_info_get.o tx_semaphore_prioritize.o tx_semaphore_put.o tx_semaphore_put_notify.o +arm-none-eabi-ar -r tx.a tx_thread_create.o tx_thread_delete.o tx_thread_entry_exit_notify.o tx_thread_identify.o tx_thread_info_get.o tx_thread_initialize.o +arm-none-eabi-ar -r tx.a tx_thread_performance_info_get.o tx_thread_performance_system_info_get.o tx_thread_preemption_change.o tx_thread_priority_change.o tx_thread_relinquish.o +arm-none-eabi-ar -r tx.a tx_thread_reset.o tx_thread_resume.o tx_thread_shell_entry.o tx_thread_sleep.o tx_thread_stack_analyze.o tx_thread_stack_error_handler.o +arm-none-eabi-ar -r tx.a tx_thread_stack_error_notify.o tx_thread_suspend.o tx_thread_system_preempt_check.o tx_thread_system_resume.o tx_thread_system_suspend.o +arm-none-eabi-ar -r tx.a tx_thread_terminate.o tx_thread_time_slice.o tx_thread_time_slice_change.o tx_thread_timeout.o tx_thread_wait_abort.o tx_time_get.o +arm-none-eabi-ar -r tx.a tx_time_set.o tx_timer_activate.o tx_timer_change.o tx_timer_create.o tx_timer_deactivate.o tx_timer_delete.o tx_timer_expiration_process.o +arm-none-eabi-ar -r tx.a tx_timer_info_get.o tx_timer_initialize.o tx_timer_performance_info_get.o tx_timer_performance_system_info_get.o tx_timer_system_activate.o +arm-none-eabi-ar -r tx.a tx_timer_system_deactivate.o tx_timer_thread_entry.o tx_trace_enable.o tx_trace_disable.o tx_trace_initialize.o tx_trace_interrupt_control.o +arm-none-eabi-ar -r tx.a tx_trace_isr_enter_insert.o tx_trace_isr_exit_insert.o tx_trace_object_register.o tx_trace_object_unregister.o tx_trace_user_event_insert.o +arm-none-eabi-ar -r tx.a tx_trace_buffer_full_notify.o tx_trace_event_filter.o tx_trace_event_unfilter.o +arm-none-eabi-ar -r tx.a txe_block_allocate.o txe_block_pool_create.o txe_block_pool_delete.o txe_block_pool_info_get.o txe_block_pool_prioritize.o txe_block_release.o +arm-none-eabi-ar -r tx.a txe_byte_allocate.o txe_byte_pool_create.o txe_byte_pool_delete.o txe_byte_pool_info_get.o txe_byte_pool_prioritize.o txe_byte_release.o +arm-none-eabi-ar -r tx.a txe_event_flags_create.o txe_event_flags_delete.o txe_event_flags_get.o txe_event_flags_info_get.o txe_event_flags_set.o +arm-none-eabi-ar -r tx.a txe_event_flags_set_notify.o txe_mutex_create.o txe_mutex_delete.o txe_mutex_get.o txe_mutex_info_get.o txe_mutex_prioritize.o +arm-none-eabi-ar -r tx.a txe_mutex_put.o txe_queue_create.o txe_queue_delete.o txe_queue_flush.o txe_queue_front_send.o txe_queue_info_get.o txe_queue_prioritize.o +arm-none-eabi-ar -r tx.a txe_queue_receive.o txe_queue_send.o txe_queue_send_notify.o txe_semaphore_ceiling_put.o txe_semaphore_create.o txe_semaphore_delete.o +arm-none-eabi-ar -r tx.a txe_semaphore_get.o txe_semaphore_info_get.o txe_semaphore_prioritize.o txe_semaphore_put.o txe_semaphore_put_notify.o txe_thread_create.o +arm-none-eabi-ar -r tx.a txe_thread_delete.o txe_thread_entry_exit_notify.o txe_thread_info_get.o txe_thread_preemption_change.o txe_thread_priority_change.o +arm-none-eabi-ar -r tx.a txe_thread_relinquish.o txe_thread_reset.o txe_thread_resume.o txe_thread_suspend.o txe_thread_terminate.o txe_thread_time_slice_change.o +arm-none-eabi-ar -r tx.a txe_thread_wait_abort.o txe_timer_activate.o txe_timer_change.o txe_timer_create.o txe_timer_deactivate.o txe_timer_delete.o txe_timer_info_get.o diff --git a/ports/cortex_r5/gnu/example_build/build_threadx_sample.bat b/ports/cortex_r5/gnu/example_build/build_threadx_sample.bat new file mode 100644 index 00000000..2ded427d --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/build_threadx_sample.bat @@ -0,0 +1,6 @@ +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 reset.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 crt0.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 tx_initialize_low_level.S +arm-none-eabi-gcc -c -g -mcpu=cortex-r5 -I../../../../common/inc -I../inc sample_threadx.c +arm-none-eabi-ld -A cortex-r5 -T sample_threadx.ld reset.o crt0.o tx_initialize_low_level.o sample_threadx.o tx.a libc.a libgcc.a -o sample_threadx.out -M > sample_threadx.map + diff --git a/ports/cortex_r5/gnu/example_build/crt0.S b/ports/cortex_r5/gnu/example_build/crt0.S new file mode 100644 index 00000000..aa0f3239 --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/crt0.S @@ -0,0 +1,90 @@ + +/* .text is used instead of .section .text so it works with arm-aout too. */ + .text + .code 32 + .align 0 + + .global _mainCRTStartup + .global _start + .global start +start: +_start: +_mainCRTStartup: + +/* Start by setting up a stack */ + /* Set up the stack pointer to a fixed value */ + ldr r3, .LC0 + mov sp, r3 + /* Setup a default stack-limit in case the code has been + compiled with "-mapcs-stack-check". Hard-wiring this value + is not ideal, since there is currently no support for + checking that the heap and stack have not collided, or that + this default 64k is enough for the program being executed. + However, it ensures that this simple crt0 world will not + immediately cause an overflow event: */ + sub sl, sp, #64 << 10 /* Still assumes 256bytes below sl */ + mov a2, #0 /* Second arg: fill value */ + mov fp, a2 /* Null frame pointer */ + mov r7, a2 /* Null frame pointer for Thumb */ + + ldr a1, .LC1 /* First arg: start of memory block */ + ldr a3, .LC2 + sub a3, a3, a1 /* Third arg: length of block */ + + + + bl memset + mov r0, #0 /* no arguments */ + mov r1, #0 /* no argv either */ +#ifdef __USES_INITFINI__ + /* Some arm/elf targets use the .init and .fini sections + to create constructors and destructors, and for these + targets we need to call the _init function and arrange + for _fini to be called at program exit. */ + mov r4, r0 + mov r5, r1 +/* ldr r0, .Lfini */ + bl atexit +/* bl init */ + mov r0, r4 + mov r1, r5 +#endif + bl main + + bl exit /* Should not return. */ + + + /* For Thumb, constants must be after the code since only + positive offsets are supported for PC relative addresses. */ + + .align 0 +.LC0: +.LC1: + .word __bss_start__ +.LC2: + .word __bss_end__ +/* +#ifdef __USES_INITFINI__ +.Lfini: + .word _fini +#endif */ + /* Return ... */ +#ifdef __APCS_26__ + movs pc, lr +#else +#ifdef __THUMB_INTERWORK + bx lr +#else + mov pc, lr +#endif +#endif + + +/* Workspace for Angel calls. */ + .data +/* Data returned by monitor SWI. */ +.global __stack_base__ +HeapBase: .word 0 +HeapLimit: .word 0 +__stack_base__: .word 0 +StackLimit: .word 0 diff --git a/ports/cortex_r5/gnu/example_build/libc.a b/ports/cortex_r5/gnu/example_build/libc.a new file mode 100644 index 00000000..5b04fa4e Binary files /dev/null and b/ports/cortex_r5/gnu/example_build/libc.a differ diff --git a/ports/cortex_r5/gnu/example_build/libgcc.a b/ports/cortex_r5/gnu/example_build/libgcc.a new file mode 100644 index 00000000..d7353496 Binary files /dev/null and b/ports/cortex_r5/gnu/example_build/libgcc.a differ diff --git a/ports/cortex_r5/gnu/example_build/reset.S b/ports/cortex_r5/gnu/example_build/reset.S new file mode 100644 index 00000000..856e31eb --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/reset.S @@ -0,0 +1,76 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + + .global _start + .global __tx_undefined + .global __tx_swi_interrupt + .global __tx_prefetch_handler + .global __tx_abort_handler + .global __tx_reserved_handler + .global __tx_irq_handler + .global __tx_fiq_handler +@ +@ +@/* Define the vector area. This should be located or copied to 0. */ +@ + .text + .global __vectors +__vectors: + + LDR pc, STARTUP @ Reset goes to startup function + LDR pc, UNDEFINED @ Undefined handler + LDR pc, SWI @ Software interrupt handler + LDR pc, PREFETCH @ Prefetch exception handler + LDR pc, ABORT @ Abort exception handler + LDR pc, RESERVED @ Reserved exception handler + LDR pc, IRQ @ IRQ interrupt handler + LDR pc, FIQ @ FIQ interrupt handler + +STARTUP: + .word _start @ Reset goes to C startup function +UNDEFINED: + .word __tx_undefined @ Undefined handler +SWI: + .word __tx_swi_interrupt @ Software interrupt handler +PREFETCH: + .word __tx_prefetch_handler @ Prefetch exception handler +ABORT: + .word __tx_abort_handler @ Abort exception handler +RESERVED: + .word __tx_reserved_handler @ Reserved exception handler +IRQ: + .word __tx_irq_handler @ IRQ interrupt handler +FIQ: + .word __tx_fiq_handler @ FIQ interrupt handler diff --git a/ports/cortex_r5/gnu/example_build/sample_threadx.c b/ports/cortex_r5/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..418ec634 --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/sample_threadx.c @@ -0,0 +1,369 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r5/gnu/example_build/sample_threadx.ld b/ports/cortex_r5/gnu/example_build/sample_threadx.ld new file mode 100644 index 00000000..3dea4e1c --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/sample_threadx.ld @@ -0,0 +1,239 @@ +OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", + "elf32-littlearm") +OUTPUT_ARCH(arm) +/* ENTRY(_start) */ +/* Do we need any of these for elf? + __DYNAMIC = 0; */ +SECTIONS +{ + . = 0x00000000; + + .vectors : {reset.o(.text) } + + /* Read-only sections, merged into text segment: */ + . = 0x00001000; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7t) *(.glue_7) + } =0 + .init : + { + KEEP (*(.init)) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(256) + (. & (256 - 1)); + .data : + { + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { KEEP (*(.eh_frame)) } + .gcc_except_table : { *(.gcc_except_table) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + __bss_start__ = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + + _bss_end__ = . ; __bss_end__ = . ; + PROVIDE (end = .); + + .stack : + { + + _stack_bottom = ABSOLUTE(.) ; + + /* Allocate room for stack. This must be big enough for the IRQ, FIQ, and + SYS stack if nested interrupts are enabled. */ + . = ALIGN(8) ; + . += 4096 ; + _sp = . - 16 ; + _stack_top = ABSOLUTE(.) ; + } + + _end = .; __end__ = . ; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + + /* These must appear regardless of . */ +} diff --git a/ports/cortex_r5/gnu/example_build/tx_initialize_low_level.S b/ports/cortex_r5/gnu/example_build/tx_initialize_low_level.S new file mode 100644 index 00000000..bab0097a --- /dev/null +++ b/ports/cortex_r5/gnu/example_build/tx_initialize_low_level.S @@ -0,0 +1,347 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Initialize */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_initialize.h" +@#include "tx_thread.h" +@#include "tx_timer.h" + + .arm + +SVC_MODE = 0xD3 @ Disable IRQ/FIQ SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ IRQ mode +FIQ_MODE = 0xD1 @ Disable IRQ/FIQ FIQ mode +SYS_MODE = 0xDF @ Disable IRQ/FIQ SYS mode +FIQ_STACK_SIZE = 512 @ FIQ stack size +IRQ_STACK_SIZE = 1024 @ IRQ stack size +SYS_STACK_SIZE = 1024 @ System stack size +@ +@ + .global _tx_thread_system_stack_ptr + .global _tx_initialize_unused_memory + .global _tx_thread_context_save + .global _tx_thread_context_restore + .global _tx_timer_interrupt + .global _end + .global _sp + .global _stack_bottom + +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_initialize_low_level for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_initialize_low_level + .type $_tx_initialize_low_level,function +$_tx_initialize_low_level: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_initialize_low_level @ Call _tx_initialize_low_level function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_initialize_low_level Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for any low-level processor */ +@/* initialization, including setting up interrupt vectors, setting */ +@/* up a periodic timer interrupt source, saving the system stack */ +@/* pointer for use in ISR processing later, and finding the first */ +@/* available RAM memory address for tx_application_define. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_initialize_low_level(VOID) +@{ + .global _tx_initialize_low_level + .type _tx_initialize_low_level,function +_tx_initialize_low_level: +@ +@ /* We must be in SVC mode at this point! */ +@ +@ /* Setup various stack pointers. */ +@ + LDR r1, =_sp @ Get pointer to stack area + +#ifdef TX_ENABLE_IRQ_NESTING +@ +@ /* Setup the system mode stack for nested interrupt support */ +@ + LDR r2, =SYS_STACK_SIZE @ Pickup stack size + MOV r3, #SYS_MODE @ Build SYS mode CPSR + MSR CPSR_c, r3 @ Enter SYS mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup SYS stack pointer + SUB r1, r1, r2 @ Calculate start of next stack +#endif + + LDR r2, =FIQ_STACK_SIZE @ Pickup stack size + MOV r0, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR, r0 @ Enter FIQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup FIQ stack pointer + SUB r1, r1, r2 @ Calculate start of next stack + LDR r2, =IRQ_STACK_SIZE @ Pickup IRQ stack size + MOV r0, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR, r0 @ Enter IRQ mode + SUB r1, r1, #1 @ Backup 1 byte + BIC r1, r1, #7 @ Ensure 8-byte alignment + MOV sp, r1 @ Setup IRQ stack pointer + SUB r3, r1, r2 @ Calculate end of IRQ stack + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR, r0 @ Enter SVC mode + LDR r2, =_stack_bottom @ Pickup stack bottom + CMP r3, r2 @ Compare the current stack end with the bottom +_stack_error_loop: + BLT _stack_error_loop @ If the IRQ stack exceeds the stack bottom, just sit here! +@ +@ /* Save the system stack pointer. */ +@ _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +@ + LDR r2, =_tx_thread_system_stack_ptr @ Pickup stack pointer + STR r1, [r2] @ Save the system stack +@ +@ /* Save the first available memory address. */ +@ _tx_initialize_unused_memory = (VOID_PTR) _end; +@ + LDR r1, =_end @ Get end of non-initialized RAM area + LDR r2, =_tx_initialize_unused_memory @ Pickup unused memory ptr address + ADD r1, r1, #8 @ Increment to next free word + STR r1, [r2] @ Save first free memory address +@ +@ /* Setup Timer for periodic interrupts. */ +@ +@ /* Done, return to caller. */ +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} +@ +@ +@/* Define shells for each of the interrupt vectors. */ +@ + .global __tx_undefined +__tx_undefined: + B __tx_undefined @ Undefined handler +@ + .global __tx_swi_interrupt +__tx_swi_interrupt: + B __tx_swi_interrupt @ Software interrupt handler +@ + .global __tx_prefetch_handler +__tx_prefetch_handler: + B __tx_prefetch_handler @ Prefetch exception handler +@ + .global __tx_abort_handler +__tx_abort_handler: + B __tx_abort_handler @ Abort exception handler +@ + .global __tx_reserved_handler +__tx_reserved_handler: + B __tx_reserved_handler @ Reserved exception handler +@ + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +@ +@ /* For debug purpose, execute the timer interrupt processing here. In +@ a real system, some kind of status indication would have to be checked +@ before the timer interrupt handler could be called. */ +@ + BL _tx_timer_interrupt @ Timer interrupt handler +@ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +@ +@ +@ /* This is an example of a vectored IRQ handler. */ +@ +@ .global __tx_example_vectored_irq_handler +@__tx_example_vectored_irq_handler: +@ +@ +@ /* Save initial context and call context save to prepare for +@ vectored ISR execution. */ +@ +@ STMDB sp!, {r0-r3} @ Save some scratch registers +@ MRS r0, SPSR @ Pickup saved SPSR +@ SUB lr, lr, #4 @ Adjust point of interrupt +@ STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers +@ BL _tx_thread_vectored_context_save @ Vectored context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. In +@ addition, IRQ interrupts may be re-enabled - with certain restrictions - +@ if nested IRQ interrupts are desired. Interrupts may be re-enabled over +@ small code sequences where lr is saved before enabling interrupts and +@ restored after interrupts are again disabled. */ +@ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +@ from IRQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with IRQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all IRQ interrupts are cleared +@ prior to enabling nested IRQ interrupts. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_start +@#endif +@ +@ /* Application IRQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_context_restore. +@ This routine returns in processing in IRQ mode with interrupts disabled. */ +@#ifdef TX_ENABLE_IRQ_NESTING +@ BL _tx_thread_irq_nesting_end +@#endif +@ +@ /* Jump to context restore to restore system context. */ +@ B _tx_thread_context_restore +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Interrupt nesting is allowed after calling _tx_thread_fiq_nesting_start +@ from FIQ mode with interrupts disabled. This routine switches to the +@ system mode and returns with FIQ interrupts enabled. +@ +@ NOTE: It is very important to ensure all FIQ interrupts are cleared +@ prior to enabling nested FIQ interrupts. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_start +#endif +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* If interrupt nesting was started earlier, the end of interrupt nesting +@ service must be called before returning to _tx_thread_fiq_context_restore. */ +#ifdef TX_ENABLE_FIQ_NESTING + BL _tx_thread_fiq_nesting_end +#endif +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore +@ +@ +#else + .global __tx_fiq_handler +__tx_fiq_handler: + B __tx_fiq_handler @ FIQ interrupt handler +#endif +@ +@ +BUILD_OPTIONS: + .word _tx_build_options @ Reference to bring in +VERSION_ID: + .word _tx_version_id @ Reference to bring in + + + diff --git a/ports/cortex_r5/gnu/inc/tx_port.h b/ports/cortex_r5/gnu/inc/tx_port.h new file mode 100644 index 00000000..c5251fa8 --- /dev/null +++ b/ports/cortex_r5/gnu/inc/tx_port.h @@ -0,0 +1,316 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R5/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_INT_DISABLE 0xC0 /* Disable IRQ & FIQ interrupts */ +#else +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#endif +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_FIQ_ENABLED 1 +#else +#define TX_FIQ_ENABLED 0 +#endif + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 2 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#ifdef TX_ENABLE_FIQ_NESTING +#define TX_FIQ_NESTING_ENABLED 4 +#else +#define TX_FIQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS TX_FIQ_ENABLED | TX_IRQ_NESTING_ENABLED | TX_FIQ_NESTING_ENABLED + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#if __TARGET_ARCH_ARM > 4 + +#ifndef __thumb__ + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + asm volatile (" CLZ %0,%1 ": "=r" (b) : "r" (m) ); \ + b = 31 - b; +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +#ifdef __thumb__ + +unsigned int _tx_thread_interrupt_disable(void); +unsigned int _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else + +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save, tx_temp; + +#ifdef TX_ENABLE_FIQ_SUPPORT +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID if ": "=r" (interrupt_save) ); +#else +#define TX_DISABLE asm volatile (" MRS %0,CPSR; CPSID i ": "=r" (interrupt_save) ); +#endif + +#define TX_RESTORE asm volatile (" MSR CPSR_c,%0 "::"r" (interrupt_save) ); + +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R5/GNU Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +#endif + diff --git a/ports/cortex_r5/gnu/readme_threadx.txt b/ports/cortex_r5/gnu/readme_threadx.txt new file mode 100644 index 00000000..8c26cebd --- /dev/null +++ b/ports/cortex_r5/gnu/readme_threadx.txt @@ -0,0 +1,496 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R5 + + Using the GNU Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. + +At this point you may run the build_threadx.bat batch file. This will build the +ThreadX run-time environment in the "example_build" directory. + +You should observe assembly and compilation of a series of ThreadX source +files. At the end of the batch file, they are all combined into the +run-time library file: tx.a. This file must be linked with your +application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the build_threadx_sample.bat +batch file while inside the "example_build" directory. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with TX.A. The resulting file DEMO is a binary file +that can be downloaded and executed. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R5 using GNU tools is at label _start. +This is defined within the modified version of the GNU startup code - crt0.S. + +The ThreadX tx_initialize_low_level.S file is responsible for setting up various +system data structures, the interrupt vectors, and a periodic timer interrupt source. +By default, the vector area is defined to be located at the "__vectors" label, +which is defined in reset.S. This area is typically located at 0. In situations +where this is impossible, the vectors at the "__vectors" label should be copied +to address 0. + +This is also where initialization of a periodic timer interrupt source should take +place. + +In addition, _tx_initialize_low_level defines the first available address +for use by the application, which is supplied as the sole input parameter +to your application definition function, tx_application_define. + + +4. Assembler / Compiler Switches + +The following are compiler switches used in building the demonstration +system: + +Compiler/Assembler Meaning + Switches + + -g Specifies debug information + -c Specifies object code generation + -mcpu=cortex-r5 Specifies target cpu + +Linker Switch Meaning + + -o sample_threadx.out Specifies output file + -M > sample_threadx.map Specifies demo map file + -A cortex-r5 Specifies target architecture + -T sample_threadx.ld Specifies the loader control file + +Application Defines ( -D option) + + TX_ENABLE_FIQ_SUPPORT This assembler define enables FIQ + interrupt handling support in the + ThreadX assembly files. If used, + it should be used on all assembly + files and the generic C source of + ThreadX should be compiled with + TX_ENABLE_FIQ_SUPPORT defined as well. + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. + + TX_ENABLE_FIQ_NESTING This assembler define enables FIQ + nested support. If FIQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.S. In addition, + IRQ nesting should also be enabled. + + TX_ENABLE_FIQ_SUPPORT This compiler define enables FIQ + interrupt handling in the ThreadX + generic C source. This define + should also be used in conjunction + with the corresponding assembler + define. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + +5. Register Usage and Stack Frames + +The GNU compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are scratch +registers for each function. All other registers used by a C function must +be preserved by the function. ThreadX takes advantage of this in situations +where a context switch happens as a result of making a ThreadX service call +(which is itself a C function). In such cases, the saved context of a thread +is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R5 vectors start at address zero. The demonstration system startup +reset.S file contains the vectors and is loaded at address zero. On actual +hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports +nested IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.S: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save @ Jump to the context save +__tx_irq_processing_return: +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.S: + + .global __tx_irq_example_handler +__tx_irq_example_handler: +@ +@ /* Call context save to save system context. */ + + STMDB sp!, {r0-r3} @ Save some scratch registers + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other scratch registers + BL _tx_thread_vectored_context_save @ Call the vectored IRQ context save +@ +@ /* At this point execution is still in the IRQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. Note +@ that IRQ interrupts are still disabled upon return from the context +@ save function. */ +@ +@ /* Application ISR call goes here! */ +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + .global __tx_irq_handler + .global __tx_irq_processing_return +__tx_irq_handler: +@ +@ /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return: +@ +@ /* Enable nested IRQ interrupts. NOTE: Since this service returns +@ with IRQ interrupts enabled, all IRQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_irq_nesting_start +@ +@ /* Application ISR call(s) go here! */ +@ +@ /* Disable nested IRQ interrupts. The mode is switched back to +@ IRQ mode and IRQ interrupts are disable upon return. */ + BL _tx_thread_irq_nesting_end +@ +@ /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of each thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.S. + + +7.3.1 Managed FIQ Interrupts + +Full ThreadX management of FIQ interrupts is provided if the ThreadX sources +are built with the TX_ENABLE_FIQ_SUPPORT defined. If the library is built +this way, the FIQ interrupt handlers are very similar to the IRQ interrupt +handlers defined previously. The following is default FIQ handler +defined in tx_initialize_low_level.S: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +7.3.1.1 Nested FIQ Support + +By default, nested FIQ interrupt support is not enabled. To enable nested +FIQ support, the entire library should be built with TX_ENABLE_FIQ_NESTING +defined. With this defined, two new FIQ interrupt management services are +available, namely _tx_thread_fiq_nesting_start and _tx_thread_fiq_nesting_end. +These function should be called between the FIQ context save and restore +calls. + +Execution between the calls to _tx_thread_fiq_nesting_start and +_tx_thread_fiq_nesting_end is enabled for FIQ nesting. This is achieved +by switching from FIQ mode to SYS mode and enabling FIQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.S. When nested FIQ interrupts are no longer required, +calling the _tx_thread_fiq_nesting_end service disables nesting by disabling +FIQ interrupts and switching back to FIQ mode in preparation for the FIQ +context restore service. + +The following is an example of enabling FIQ nested interrupts in the +typical FIQ handler: + + + .global __tx_fiq_handler + .global __tx_fiq_processing_return +__tx_fiq_handler: +@ +@ /* Jump to fiq context save to save system context. */ + B _tx_thread_fiq_context_save +__tx_fiq_processing_return: +@ +@ /* At this point execution is still in the FIQ mode. The CPSR, point of +@ interrupt, and all C scratch registers are available for use. */ +@ +@ /* Enable nested FIQ interrupts. NOTE: Since this service returns +@ with FIQ interrupts enabled, all FIQ interrupt sources must be +@ cleared prior to calling this service. */ + BL _tx_thread_fiq_nesting_start +@ +@ /* Application FIQ handlers can be called here! */ +@ +@ /* Disable nested FIQ interrupts. The mode is switched back to +@ FIQ mode and FIQ interrupts are disable upon return. */ + BL _tx_thread_fiq_nesting_end +@ +@ /* Jump to fiq context restore to restore system context. */ + B _tx_thread_fiq_context_restore + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional but the remainder of +ThreadX will still run. + +To add the timer interrupt processing, simply make a call to +_tx_timer_interrupt in the IRQ processing. An example of this can be +found in the file tx_initialize_low_level.S for the demonstration system. + + +9. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Cortex-R5 using GNU tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r5/gnu/src/tx_thread_context_restore.S b/ports/cortex_r5/gnu/src/tx_thread_context_restore.S new file mode 100644 index 00000000..cdca28e5 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_context_restore.S @@ -0,0 +1,256 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm + +#ifdef TX_ENABLE_FIQ_SUPPORT +SVC_MODE = 0xD3 @ Disable IRQ/FIQ, SVC mode +IRQ_MODE = 0xD2 @ Disable IRQ/FIQ, IRQ mode +#else +SVC_MODE = 0x93 @ Disable IRQ, SVC mode +IRQ_MODE = 0x92 @ Disable IRQ, IRQ mode +#endif +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_restore Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the interrupt context if it is processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_restore(VOID) +@{ + .global _tx_thread_context_restore + .type _tx_thread_context_restore,function +_tx_thread_context_restore: +@ +@ /* Lockout interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_restore @ Yes, idle system was interrupted +@ + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_preempt_restore @ No, preemption needs to happen +@ +@ +__tx_thread_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_preempt_restore: +@ + LDMIA sp!, {r3, r10, r12, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #IRQ_MODE @ Build IRQ mode CPSR + MSR CPSR_c, r2 @ Enter IRQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r2, [r0, #144] @ Pickup the VFP enabled flag + CMP r2, #0 @ Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save @ No, skip VFP IRQ save + VMRS r2, FPSCR @ Pickup the FPSCR + STR r2, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D0-D15} @ Save D0-D15 +_tx_skip_irq_vfp_save: +#endif +@ + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + MOV r0, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r0 @ Enter SVC mode + B _tx_thread_schedule @ Return to scheduler +@} + + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_context_save.S b/ports/cortex_r5/gnu/src/tx_thread_context_save.S new file mode 100644 index 00000000..ac7a98f4 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_context_save.S @@ -0,0 +1,203 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_irq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_context_save Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_context_save(VOID) +@{ + .global _tx_thread_context_save + .type _tx_thread_context_save,function +_tx_thread_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} @ Store other registers +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr@ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #16 @ Recover saved registers + B __tx_irq_processing_return @ Continue IRQ processing +@ +@ } +@} + + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S new file mode 100644 index 00000000..955a9e8c --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_restore.S @@ -0,0 +1,247 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ +SVC_MODE = 0xD3 @ SVC mode +FIQ_MODE = 0xD1 @ FIQ mode +MODE_MASK = 0x1F @ Mode mask +THUMB_MASK = 0x20 @ Thumb bit mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_thread_system_stack_ptr + .global _tx_thread_execute_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_thread_preempt_disable + .global _tx_execution_isr_exit +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_restore +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_restore Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function restores the fiq interrupt context when processing a */ +@/* nested interrupt. If not, it returns to the interrupt thread if no */ +@/* preemption is necessary. Otherwise, if preemption is necessary or */ +@/* if no thread was running, the function returns to the scheduler. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling routine */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* FIQ ISR Interrupt Service Routines */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_context_restore(VOID) +@{ + .global _tx_thread_fiq_context_restore + .type _tx_thread_fiq_context_restore,function +_tx_thread_fiq_context_restore: +@ +@ /* Lockout interrupts. */ +@ + CPSID if @ Disable IRQ and FIQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR exit function to indicate an ISR is complete. */ +@ + BL _tx_execution_isr_exit @ Call the ISR exit function +#endif +@ +@ /* Determine if interrupts are nested. */ +@ if (--_tx_thread_system_state) +@ { +@ + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + SUB r2, r2, #1 @ Decrement the counter + STR r2, [r3] @ Store the counter + CMP r2, #0 @ Was this the first interrupt? + BEQ __tx_thread_fiq_not_nested_restore @ If so, not a nested restore +@ +@ /* Interrupts are nested. */ +@ +@ /* Just recover the saved registers and return to the point of +@ interrupt. */ +@ + LDMIA sp!, {r0, r10, r12, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +__tx_thread_fiq_not_nested_restore: +@ +@ /* Determine if a thread was interrupted and no preemption is required. */ +@ else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +@ || (_tx_thread_preempt_disable)) +@ { +@ + LDR r1, [sp] @ Pickup the saved SPSR + MOV r2, #MODE_MASK @ Build mask to isolate the interrupted mode + AND r1, r1, r2 @ Isolate mode bits + CMP r1, #IRQ_MODE_BITS @ Was an interrupt taken in IRQ mode before we + @ got to context save? */ + BEQ __tx_thread_fiq_no_preempt_restore @ Yes, just go back to point of interrupt + + + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup actual current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_restore @ Yes, idle system was interrupted + + LDR r3, =_tx_thread_preempt_disable @ Pickup preempt disable address + LDR r2, [r3] @ Pickup actual preempt disable flag + CMP r2, #0 @ Is it set? + BNE __tx_thread_fiq_no_preempt_restore @ Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr @ Pickup address of execute thread ptr + LDR r2, [r3] @ Pickup actual execute thread pointer + CMP r0, r2 @ Is the same thread highest priority? + BNE __tx_thread_fiq_preempt_restore @ No, preemption needs to happen + + +__tx_thread_fiq_no_preempt_restore: +@ +@ /* Restore interrupted thread or ISR. */ +@ +@ /* Pickup the saved stack pointer. */ +@ tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +@ +@ /* Recover the saved context and return to the point of interrupt. */ +@ + LDMIA sp!, {r0, lr} @ Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 @ Put SPSR back + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOVS pc, lr @ Return to point of interrupt +@ +@ } +@ else +@ { +__tx_thread_fiq_preempt_restore: +@ + LDMIA sp!, {r3, lr} @ Recover temporarily saved registers + MOV r1, lr @ Save lr (point of interrupt) + MOV r2, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r2 @ Enter SVC mode + STR r1, [sp, #-4]! @ Save point of interrupt + STMDB sp!, {r4-r12, lr} @ Save upper half of registers + MOV r4, r3 @ Save SPSR in r4 + MOV r2, #FIQ_MODE @ Build FIQ mode CPSR + MSR CPSR_c, r2 @ Reenter FIQ mode + LDMIA sp!, {r0-r3} @ Recover r0-r3 + MOV r5, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r5 @ Enter SVC mode + STMDB sp!, {r0-r3} @ Save r0-r3 on thread's stack + MOV r3, #1 @ Build interrupt stack type + STMDB sp!, {r3, r4} @ Save interrupt stack type and SPSR + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + STR sp, [r0, #8] @ Save stack pointer in thread control + @ block */ +@ +@ /* Save the remaining time-slice and disable it. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup time-slice variable address + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it active? + BEQ __tx_thread_fiq_dont_save_ts @ No, don't save it +@ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r2, [r0, #24] @ Save thread's time-slice + MOV r2, #0 @ Clear value + STR r2, [r3] @ Disable global time-slice flag +@ +@ } +__tx_thread_fiq_dont_save_ts: +@ +@ +@ /* Clear the current task pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + MOV r0, #0 @ NULL value + STR r0, [r1] @ Clear current thread pointer +@ +@ /* Return to the scheduler. */ +@ _tx_thread_schedule(); +@ + B _tx_thread_schedule @ Return to scheduler +@ } +@ +__tx_thread_fiq_idle_system_restore: +@ +@ /* Just return back to the scheduler! */ +@ + ADD sp, sp, #24 @ Recover FIQ stack space + MOV r3, #SVC_MODE @ Build SVC mode CPSR + MSR CPSR_c, r3 @ Lockout interrupts + B _tx_thread_schedule @ Return to scheduler +@ +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S new file mode 100644 index 00000000..576ecc4c --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_context_save.S @@ -0,0 +1,204 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global __tx_fiq_processing_return + .global _tx_execution_isr_enter +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_context_save Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@ VOID _tx_thread_fiq_context_save(VOID) +@{ + .global _tx_thread_fiq_context_save + .type _tx_thread_fiq_context_save,function +_tx_thread_fiq_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ + STMDB sp!, {r0-r3} @ Save some working registers + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_fiq_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable +@ +@ /* Save the rest of the scratch registers on the stack and return to the +@ calling ISR. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} @ Store other registers +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +__tx_thread_fiq_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_fiq_idle_system_save @ If so, interrupt occurred in +@ @ scheduling loop - nothing needs saving! +@ +@ /* Save minimal context of interrupted thread. */ +@ + MRS r2, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r2, lr} @ Store other registers, Note that we don't +@ @ need to save sl and ip since FIQ has +@ @ copies of these registers. Nested +@ @ interrupt processing does need to save +@ @ these registers. +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@ else +@ { +@ +__tx_thread_fiq_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif +@ +@ /* Not much to do here, save the current SPSR and LR for possible +@ use in IRQ interrupted in idle system conditions, and return to +@ FIQ interrupt processing. */ +@ + MRS r0, SPSR @ Pickup saved SPSR + SUB lr, lr, #4 @ Adjust point of interrupt + STMDB sp!, {r0, lr} @ Store other registers that will get used +@ @ or stripped off the stack in context +@ @ restore + B __tx_fiq_processing_return @ Continue FIQ processing +@ +@ } +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S new file mode 100644 index 00000000..d3e4972a --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_end.S @@ -0,0 +1,116 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +FIQ_MODE_BITS = 0x11 @ FIQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_end Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_nesting_start has been called and switches the FIQ */ +@/* processing from system mode back to FIQ mode prior to the ISR */ +@/* calling _tx_thread_fiq_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_end(VOID) +@{ + .global _tx_thread_fiq_nesting_end + .type _tx_thread_fiq_nesting_end,function +_tx_thread_fiq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #FIQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode + +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S new file mode 100644 index 00000000..0b2ef7e0 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_fiq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +FIQ_DISABLE = 0x40 @ FIQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_fiq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_fiq_nesting_start Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from FIQ mode after */ +@/* _tx_thread_fiq_context_save has been called and switches the FIQ */ +@/* processing to the system mode so nested FIQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with FIQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_fiq_nesting_start(VOID) +@{ + .global _tx_thread_fiq_nesting_start + .type _tx_thread_fiq_nesting_start,function +_tx_thread_fiq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #FIQ_DISABLE @ Build enable FIQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S b/ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S new file mode 100644 index 00000000..ac10ca1e --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_interrupt_control.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" */ +@ + +INT_MASK = 0x03F + +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_control for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_control +$_tx_thread_interrupt_control: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_control @ Call _tx_thread_interrupt_control function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_control Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for changing the interrupt lockout */ +@/* posture of the system. */ +@/* */ +@/* INPUT */ +@/* */ +@/* new_posture New interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_control(UINT new_posture) +@{ + .global _tx_thread_interrupt_control + .type _tx_thread_interrupt_control,function +_tx_thread_interrupt_control: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r3, CPSR @ Pickup current CPSR + MOV r2, #INT_MASK @ Build interrupt mask + AND r1, r3, r2 @ Clear interrupt lockout bits + ORR r1, r1, r0 @ Or-in new interrupt lockout bits +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r1 @ Setup new CPSR + BIC r0, r3, r2 @ Return previous interrupt mask +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S b/ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S new file mode 100644 index 00000000..dd2ba781 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_interrupt_disable.S @@ -0,0 +1,113 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_disable for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_disable +$_tx_thread_interrupt_disable: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_disable @ Call _tx_thread_interrupt_disable function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_disable Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for disabling interrupts */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_disable(void) +@{ + .global _tx_thread_interrupt_disable + .type _tx_thread_interrupt_disable,function +_tx_thread_interrupt_disable: +@ +@ /* Pickup current interrupt lockout posture. */ +@ + MRS r0, CPSR @ Pickup current CPSR +@ +@ /* Mask interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ +#else + CPSID i @ Disable IRQ +#endif + +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S b/ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S new file mode 100644 index 00000000..885b43c8 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_interrupt_restore.S @@ -0,0 +1,104 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_interrupt_restore for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_interrupt_restore +$_tx_thread_interrupt_restore: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_interrupt_restore @ Call _tx_thread_interrupt_restore function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_interrupt_restore Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is responsible for restoring interrupts to the state */ +@/* returned by a previous _tx_thread_interrupt_disable call. */ +@/* */ +@/* INPUT */ +@/* */ +@/* old_posture Old interrupt lockout posture */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* Application Code */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@UINT _tx_thread_interrupt_restore(UINT old_posture) +@{ + .global _tx_thread_interrupt_restore + .type _tx_thread_interrupt_restore,function +_tx_thread_interrupt_restore: +@ +@ /* Apply the new interrupt posture. */ +@ + MSR CPSR_c, r0 @ Setup new CPSR +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S new file mode 100644 index 00000000..8d1d1952 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_end.S @@ -0,0 +1,115 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT +DISABLE_INTS = 0xC0 @ Disable IRQ/FIQ interrupts +#else +DISABLE_INTS = 0x80 @ Disable IRQ interrupts +#endif +MODE_MASK = 0x1F @ Mode mask +IRQ_MODE_BITS = 0x12 @ IRQ mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_end +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_end Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +@/* processing from system mode back to IRQ mode prior to the ISR */ +@/* calling _tx_thread_context_restore. Note that this function */ +@/* assumes the system stack pointer is in the same position after */ +@/* nesting start function was called. */ +@/* */ +@/* This function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts disabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_end(VOID) +@{ + .global _tx_thread_irq_nesting_end + .type _tx_thread_irq_nesting_end,function +_tx_thread_irq_nesting_end: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + ORR r0, r0, #DISABLE_INTS @ Build disable interrupt value + MSR CPSR_c, r0 @ Disable interrupts + LDMIA sp!, {r1, lr} @ Pickup saved lr (and r1 throw-away for + @ 8-byte alignment logic) + BIC r0, r0, #MODE_MASK @ Clear mode bits + ORR r0, r0, #IRQ_MODE_BITS @ Build IRQ mode CPSR + MSR CPSR_c, r0 @ Reenter IRQ mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S new file mode 100644 index 00000000..e2d38c62 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_irq_nesting_start.S @@ -0,0 +1,108 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ +IRQ_DISABLE = 0x80 @ IRQ disable bit +MODE_MASK = 0x1F @ Mode mask +SYS_MODE_BITS = 0x1F @ System mode bits +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_irq_nesting_start +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_irq_nesting_start Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is called by the application from IRQ mode after */ +@/* _tx_thread_context_save has been called and switches the IRQ */ +@/* processing to the system mode so nested IRQ interrupt processing */ +@/* is possible (system mode has its own "lr" register). Note that */ +@/* this function assumes that the system mode stack pointer was setup */ +@/* during low-level initialization (tx_initialize_low_level.s). */ +@/* */ +@/* This function returns with IRQ interrupts enabled. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_irq_nesting_start(VOID) +@{ + .global _tx_thread_irq_nesting_start + .type _tx_thread_irq_nesting_start,function +_tx_thread_irq_nesting_start: + MOV r3,lr @ Save ISR return address + MRS r0, CPSR @ Pickup the CPSR + BIC r0, r0, #MODE_MASK @ Clear the mode bits + ORR r0, r0, #SYS_MODE_BITS @ Build system mode CPSR + MSR CPSR_c, r0 @ Enter system mode + STMDB sp!, {r1, lr} @ Push the system mode lr on the system mode stack + @ and push r1 just to keep 8-byte alignment + BIC r0, r0, #IRQ_DISABLE @ Build enable IRQ CPSR + MSR CPSR_c, r0 @ Enter system mode +#ifdef __THUMB_INTERWORK + BX r3 @ Return to caller +#else + MOV pc, r3 @ Return to caller +#endif +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_schedule.S b/ports/cortex_r5/gnu/src/tx_thread_schedule.S new file mode 100644 index 00000000..e62fc22c --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_schedule.S @@ -0,0 +1,250 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ +@ + .global _tx_thread_execute_ptr + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_execution_thread_enter +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_schedule for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_schedule + .type $_tx_thread_schedule,function +$_tx_thread_schedule: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_schedule @ Call _tx_thread_schedule function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_schedule Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function waits for a thread control block pointer to appear in */ +@/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +@/* in the variable, the corresponding thread is resumed. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_initialize_kernel_enter ThreadX entry function */ +@/* _tx_thread_system_return Return to system from thread */ +@/* _tx_thread_context_restore Restore thread's context */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_schedule(VOID) +@{ + .global _tx_thread_schedule + .type _tx_thread_schedule,function +_tx_thread_schedule: +@ +@ /* Enable interrupts. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSIE if @ Enable IRQ and FIQ interrupts +#else + CPSIE i @ Enable IRQ interrupts +#endif +@ +@ /* Wait for a thread to execute. */ +@ do +@ { + LDR r1, =_tx_thread_execute_ptr @ Address of thread execute ptr +@ +__tx_thread_schedule_loop: +@ + LDR r0, [r1] @ Pickup next thread to execute + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_schedule_loop @ If so, keep looking for a thread +@ +@ } +@ while(_tx_thread_execute_ptr == TX_NULL); +@ +@ /* Yes! We have a thread to execute. Lockout interrupts and +@ transfer control to it. */ +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ +@ /* Setup the current thread pointer. */ +@ _tx_thread_current_ptr = _tx_thread_execute_ptr; +@ + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread + STR r0, [r1] @ Setup current thread pointer +@ +@ /* Increment the run count for this thread. */ +@ _tx_thread_current_ptr -> tx_thread_run_count++; +@ + LDR r2, [r0, #4] @ Pickup run counter + LDR r3, [r0, #24] @ Pickup time-slice for this thread + ADD r2, r2, #1 @ Increment thread run-counter + STR r2, [r0, #4] @ Store the new run counter +@ +@ /* Setup time-slice, if present. */ +@ _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time-slice + @ variable + LDR sp, [r0, #8] @ Switch stack pointers + STR r3, [r2] @ Setup time-slice +@ +@ /* Switch to the thread's stack. */ +@ sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread entry function to indicate the thread is executing. */ +@ + BL _tx_execution_thread_enter @ Call the thread execution enter function +#endif +@ +@ /* Determine if an interrupt frame or a synchronous task suspension frame +@ is present. */ +@ + LDMIA sp!, {r4, r5} @ Pickup the stack type and saved CPSR + CMP r4, #0 @ Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 @ Setup SPSR for return +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore @ No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} @ Recover D0-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ @ Return to point of thread interrupt +@ +_tx_solicited_return: +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r1, [r0, #144] @ Pickup the VFP enabled flag + CMP r1, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore @ No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} @ Recover D8-D15 + LDR r4, [sp], #4 @ Pickup FPSCR + VMSR FPSCR, r4 @ Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 @ Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} @ Return to thread synchronously + MSR CPSR_cxsf, r0 @ Recover CPSR +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} +@ +@ +#ifdef TX_ENABLE_VFP_SUPPORT + .global tx_thread_vfp_enable + .type tx_thread_vfp_enable,function +tx_thread_vfp_enable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_enable @ If NULL, skip VFP enable + MOV r0, #1 @ Build enable value + STR r0, [r1, #144] @ Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +@ + .global tx_thread_vfp_disable + .type tx_thread_vfp_disable,function +tx_thread_vfp_disable: + MRS r2, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif + LDR r0, =_tx_thread_current_ptr @ Build current thread pointer address + LDR r1, [r0] @ Pickup current thread pointer + CMP r1, #0 @ Check for NULL thread pointer + BEQ __tx_no_thread_to_disable @ If NULL, skip VFP disable + MOV r0, #0 @ Build disable value + STR r0, [r1, #144] @ Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 @ Recover CPSR + BX LR @ Return to caller +#endif + diff --git a/ports/cortex_r5/gnu/src/tx_thread_stack_build.S b/ports/cortex_r5/gnu/src/tx_thread_stack_build.S new file mode 100644 index 00000000..bed62a6d --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_stack_build.S @@ -0,0 +1,178 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ + .arm + +SVC_MODE = 0x13 @ SVC mode +#ifdef TX_ENABLE_FIQ_SUPPORT +CPSR_MASK = 0xDF @ Mask initial CPSR, IRQ & FIQ interrupts enabled +#else +CPSR_MASK = 0x9F @ Mask initial CPSR, IRQ interrupts enabled +#endif +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_stack_build for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_thread_stack_build + .type $_tx_thread_stack_build,function +$_tx_thread_stack_build: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_stack_build @ Call _tx_thread_stack_build function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_stack_build Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function builds a stack frame on the supplied thread's stack. */ +@/* The stack frame results in a fake interrupt return to the supplied */ +@/* function pointer. */ +@/* */ +@/* INPUT */ +@/* */ +@/* thread_ptr Pointer to thread control blk */ +@/* function_ptr Pointer to return function */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* _tx_thread_create Create thread service */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +@{ + .global _tx_thread_stack_build + .type _tx_thread_stack_build,function +_tx_thread_stack_build: +@ +@ +@ /* Build a fake interrupt frame. The form of the fake interrupt stack +@ on the ARM9 should look like the following after it is built: +@ +@ Stack Top: 1 Interrupt stack frame type +@ CPSR Initial value for CPSR +@ a1 (r0) Initial value for a1 +@ a2 (r1) Initial value for a2 +@ a3 (r2) Initial value for a3 +@ a4 (r3) Initial value for a4 +@ v1 (r4) Initial value for v1 +@ v2 (r5) Initial value for v2 +@ v3 (r6) Initial value for v3 +@ v4 (r7) Initial value for v4 +@ v5 (r8) Initial value for v5 +@ sb (r9) Initial value for sb +@ sl (r10) Initial value for sl +@ fp (r11) Initial value for fp +@ ip (r12) Initial value for ip +@ lr (r14) Initial value for lr +@ pc (r15) Initial value for pc +@ 0 For stack backtracing +@ +@ Stack Bottom: (higher memory address) */ +@ + LDR r2, [r0, #16] @ Pickup end of stack area + BIC r2, r2, #7 @ Ensure 8-byte alignment + SUB r2, r2, #76 @ Allocate space for the stack frame +@ +@ /* Actually build the stack frame. */ +@ + MOV r3, #1 @ Build interrupt stack type + STR r3, [r2, #0] @ Store stack type + MOV r3, #0 @ Build initial register value + STR r3, [r2, #8] @ Store initial r0 + STR r3, [r2, #12] @ Store initial r1 + STR r3, [r2, #16] @ Store initial r2 + STR r3, [r2, #20] @ Store initial r3 + STR r3, [r2, #24] @ Store initial r4 + STR r3, [r2, #28] @ Store initial r5 + STR r3, [r2, #32] @ Store initial r6 + STR r3, [r2, #36] @ Store initial r7 + STR r3, [r2, #40] @ Store initial r8 + STR r3, [r2, #44] @ Store initial r9 + LDR r3, [r0, #12] @ Pickup stack starting address + STR r3, [r2, #48] @ Store initial r10 (sl) + LDR r3,=_tx_thread_schedule @ Pickup address of _tx_thread_schedule for GDB backtrace + STR r3, [r2, #60] @ Store initial r14 (lr) + MOV r3, #0 @ Build initial register value + STR r3, [r2, #52] @ Store initial r11 + STR r3, [r2, #56] @ Store initial r12 + STR r1, [r2, #64] @ Store initial pc + STR r3, [r2, #68] @ 0 for back-trace + MRS r1, CPSR @ Pickup CPSR + BIC r1, r1, #CPSR_MASK @ Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE @ Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] @ Store initial CPSR +@ +@ /* Setup stack pointer. */ +@ thread_ptr -> tx_thread_stack_ptr = r2; +@ + STR r2, [r0, #8] @ Save stack pointer in thread's + @ control block +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@} + + diff --git a/ports/cortex_r5/gnu/src/tx_thread_system_return.S b/ports/cortex_r5/gnu/src/tx_thread_system_return.S new file mode 100644 index 00000000..c7c551a5 --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_system_return.S @@ -0,0 +1,177 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@#include "tx_timer.h" +@ + .arm +@ +@ + .global _tx_thread_current_ptr + .global _tx_timer_time_slice + .global _tx_thread_schedule + .global _tx_execution_thread_exit +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_thread_system_return for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .global $_tx_thread_system_return + .type $_tx_thread_system_return,function +$_tx_thread_system_return: + .thumb + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_thread_system_return @ Call _tx_thread_system_return function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_system_return Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function is target processor specific. It is used to transfer */ +@/* control from a thread back to the ThreadX system. Only a */ +@/* minimal context is saved since the compiler assumes temp registers */ +@/* are going to get slicked by a function call anyway. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_schedule Thread scheduling loop */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ThreadX components */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_system_return(VOID) +@{ + .global _tx_thread_system_return + .type _tx_thread_system_return,function +_tx_thread_system_return: +@ +@ /* Lockout interrupts. */ +@ + MRS r1, CPSR @ Pickup the CPSR +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#else + CPSID i @ Disable IRQ interrupts +#endif +@ /* Save minimal context on the stack. */ +@ + STMDB sp!, {r4-r11, lr} @ Save minimal context + LDR r5, =_tx_thread_current_ptr @ Pickup address of current ptr + LDR r6, [r5, #0] @ Pickup current thread pointer +@ +#ifdef TX_ENABLE_VFP_SUPPORT + LDR r0, [r6, #144] @ Pickup the VFP enabled flag + CMP r0, #0 @ Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save @ No, skip VFP solicited save + VMRS r4, FPSCR @ Pickup the FPSCR + STR r4, [sp, #-4]! @ Save FPSCR + VSTMDB sp!, {D8-D15} @ Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif +@ + MOV r0, #0 @ Build a solicited stack type + STMDB sp!, {r0-r1} @ Save type and CPSR +@ +@ +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the thread exit function to indicate the thread is no longer executing. */ +@ + BL _tx_execution_thread_exit @ Call the thread exit function +#endif +@ + LDR r2, =_tx_timer_time_slice @ Pickup address of time slice + LDR r1, [r2, #0] @ Pickup current time slice +@ +@ /* Save current stack and switch to system stack. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ sp = _tx_thread_system_stack_ptr; +@ + STR sp, [r6, #8] @ Save thread stack pointer +@ +@ /* Determine if the time-slice is active. */ +@ if (_tx_timer_time_slice) +@ { +@ + MOV r4, #0 @ Build clear value + CMP r1, #0 @ Is a time-slice active? + BEQ __tx_thread_dont_save_ts @ No, don't save the time-slice +@ +@ /* Save time-slice for the thread and clear the current time-slice. */ +@ _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +@ _tx_timer_time_slice = 0; +@ + STR r4, [r2, #0] @ Clear time-slice + STR r1, [r6, #24] @ Save current time-slice +@ +@ } +__tx_thread_dont_save_ts: +@ +@ /* Clear the current thread pointer. */ +@ _tx_thread_current_ptr = TX_NULL; +@ + STR r4, [r5, #0] @ Clear current thread pointer + B _tx_thread_schedule @ Jump to scheduler! +@ +@} + diff --git a/ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S b/ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S new file mode 100644 index 00000000..3d99f69f --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_thread_vectored_context_save.S @@ -0,0 +1,190 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Thread */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_thread.h" +@ +@ + .global _tx_thread_system_state + .global _tx_thread_current_ptr + .global _tx_execution_isr_enter +@ +@ +@ +@/* No 16-bit Thumb mode veneer code is needed for _tx_thread_vectored_context_save +@ since it will never be called 16-bit mode. */ +@ + .arm + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_thread_vectored_context_save Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function saves the context of an executing thread in the */ +@/* beginning of interrupt processing. The function also ensures that */ +@/* the system stack is used upon return to the calling ISR. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* None */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* ISRs */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_thread_vectored_context_save(VOID) +@{ + .global _tx_thread_vectored_context_save + .type _tx_thread_vectored_context_save,function +_tx_thread_vectored_context_save: +@ +@ /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +@ out, we are in IRQ mode, and all registers are intact. */ +@ +@ /* Check for a nested interrupt condition. */ +@ if (_tx_thread_system_state++) +@ { +@ +#ifdef TX_ENABLE_FIQ_SUPPORT + CPSID if @ Disable IRQ and FIQ interrupts +#endif + LDR r3, =_tx_thread_system_state @ Pickup address of system state variable + LDR r2, [r3, #0] @ Pickup system state + CMP r2, #0 @ Is this the first interrupt? + BEQ __tx_thread_not_nested_save @ Yes, not a nested context save +@ +@ /* Nested interrupt condition. */ +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Return to the ISR. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +__tx_thread_not_nested_save: +@ } +@ +@ /* Otherwise, not nested, check to see if a thread was running. */ +@ else if (_tx_thread_current_ptr) +@ { +@ + ADD r2, r2, #1 @ Increment the interrupt counter + STR r2, [r3, #0] @ Store it back in the variable + LDR r1, =_tx_thread_current_ptr @ Pickup address of current thread ptr + LDR r0, [r1, #0] @ Pickup current thread pointer + CMP r0, #0 @ Is it NULL? + BEQ __tx_thread_idle_system_save @ If so, interrupt occurred in + @ scheduling loop - nothing needs saving! +@ +@ /* Note: Minimal context of interrupted thread is already saved. */ +@ +@ /* Save the current stack pointer in the thread's control block. */ +@ _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +@ +@ /* Switch to the system stack. */ +@ sp = _tx_thread_system_stack_ptr; +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + MOV pc, lr @ Return to caller +@ +@ } +@ else +@ { +@ +__tx_thread_idle_system_save: +@ +@ /* Interrupt occurred in the scheduling loop. */ +@ +@ /* Not much to do here, just adjust the stack pointer, and return to IRQ +@ processing. */ +@ + MOV r10, #0 @ Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +@ +@ /* Call the ISR enter function to indicate an ISR is executing. */ +@ + PUSH {lr} @ Save ISR lr + BL _tx_execution_isr_enter @ Call the ISR enter function + POP {lr} @ Recover ISR lr +#endif + + ADD sp, sp, #32 @ Recover saved registers + MOV pc, lr @ Return to caller +@ +@ } +@} + diff --git a/ports/cortex_r5/gnu/src/tx_timer_interrupt.S b/ports/cortex_r5/gnu/src/tx_timer_interrupt.S new file mode 100644 index 00000000..050258bd --- /dev/null +++ b/ports/cortex_r5/gnu/src/tx_timer_interrupt.S @@ -0,0 +1,279 @@ +@/**************************************************************************/ +@/* */ +@/* Copyright (c) Microsoft Corporation. All rights reserved. */ +@/* */ +@/* This software is licensed under the Microsoft Software License */ +@/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +@/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +@/* and in the root directory of this software. */ +@/* */ +@/**************************************************************************/ +@ +@ +@/**************************************************************************/ +@/**************************************************************************/ +@/** */ +@/** ThreadX Component */ +@/** */ +@/** Timer */ +@/** */ +@/**************************************************************************/ +@/**************************************************************************/ +@ +@#define TX_SOURCE_CODE +@ +@ +@/* Include necessary system files. */ +@ +@#include "tx_api.h" +@#include "tx_timer.h" +@#include "tx_thread.h" +@ +@ + .arm + +@ +@/* Define Assembly language external references... */ +@ + .global _tx_timer_time_slice + .global _tx_timer_system_clock + .global _tx_timer_current_ptr + .global _tx_timer_list_start + .global _tx_timer_list_end + .global _tx_timer_expired_time_slice + .global _tx_timer_expired + .global _tx_thread_time_slice +@ +@ +@ +@/* Define the 16-bit Thumb mode veneer for _tx_timer_interrupt for +@ applications calling this function from to 16-bit Thumb mode. */ +@ + .text + .align 2 + .thumb + .global $_tx_timer_interrupt + .type $_tx_timer_interrupt,function +$_tx_timer_interrupt: + BX pc @ Switch to 32-bit mode + NOP @ + .arm + STMFD sp!, {lr} @ Save return address + BL _tx_timer_interrupt @ Call _tx_timer_interrupt function + LDMFD sp!, {lr} @ Recover saved return address + BX lr @ Return to 16-bit caller +@ +@ + .text + .align 2 +@/**************************************************************************/ +@/* */ +@/* FUNCTION RELEASE */ +@/* */ +@/* _tx_timer_interrupt Cortex-R5/GNU */ +@/* 6.0.1 */ +@/* AUTHOR */ +@/* */ +@/* William E. Lamie, Microsoft Corporation */ +@/* */ +@/* DESCRIPTION */ +@/* */ +@/* This function processes the hardware timer interrupt. This */ +@/* processing includes incrementing the system clock and checking for */ +@/* time slice and/or timer expiration. If either is found, the */ +@/* interrupt context save/restore functions are called along with the */ +@/* expiration functions. */ +@/* */ +@/* INPUT */ +@/* */ +@/* None */ +@/* */ +@/* OUTPUT */ +@/* */ +@/* None */ +@/* */ +@/* CALLS */ +@/* */ +@/* _tx_thread_time_slice Time slice interrupted thread */ +@/* _tx_timer_expiration_process Timer expiration processing */ +@/* */ +@/* CALLED BY */ +@/* */ +@/* interrupt vector */ +@/* */ +@/* RELEASE HISTORY */ +@/* */ +@/* DATE NAME DESCRIPTION */ +@/* */ +@/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +@/* */ +@/**************************************************************************/ +@VOID _tx_timer_interrupt(VOID) +@{ + .global _tx_timer_interrupt + .type _tx_timer_interrupt,function +_tx_timer_interrupt: +@ +@ /* Upon entry to this routine, it is assumed that context save has already +@ been called, and therefore the compiler scratch registers are available +@ for use. */ +@ +@ /* Increment the system clock. */ +@ _tx_timer_system_clock++; +@ + LDR r1, =_tx_timer_system_clock @ Pickup address of system clock + LDR r0, [r1] @ Pickup system clock + ADD r0, r0, #1 @ Increment system clock + STR r0, [r1] @ Store new system clock +@ +@ /* Test for time-slice expiration. */ +@ if (_tx_timer_time_slice) +@ { +@ + LDR r3, =_tx_timer_time_slice @ Pickup address of time-slice + LDR r2, [r3] @ Pickup time-slice + CMP r2, #0 @ Is it non-active? + BEQ __tx_timer_no_time_slice @ Yes, skip time-slice processing +@ +@ /* Decrement the time_slice. */ +@ _tx_timer_time_slice--; +@ + SUB r2, r2, #1 @ Decrement the time-slice + STR r2, [r3] @ Store new time-slice value +@ +@ /* Check for expiration. */ +@ if (__tx_timer_time_slice == 0) +@ + CMP r2, #0 @ Has it expired? + BNE __tx_timer_no_time_slice @ No, skip expiration processing +@ +@ /* Set the time-slice expired flag. */ +@ _tx_timer_expired_time_slice = TX_TRUE; +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + MOV r0, #1 @ Build expired value + STR r0, [r3] @ Set time-slice expiration flag +@ +@ } +@ +__tx_timer_no_time_slice: +@ +@ /* Test for timer expiration. */ +@ if (*_tx_timer_current_ptr) +@ { +@ + LDR r1, =_tx_timer_current_ptr @ Pickup current timer pointer address + LDR r0, [r1] @ Pickup current timer + LDR r2, [r0] @ Pickup timer list entry + CMP r2, #0 @ Is there anything in the list? + BEQ __tx_timer_no_timer @ No, just increment the timer +@ +@ /* Set expiration flag. */ +@ _tx_timer_expired = TX_TRUE; +@ + LDR r3, =_tx_timer_expired @ Pickup expiration flag address + MOV r2, #1 @ Build expired value + STR r2, [r3] @ Set expired flag + B __tx_timer_done @ Finished timer processing +@ +@ } +@ else +@ { +__tx_timer_no_timer: +@ +@ /* No timer expired, increment the timer pointer. */ +@ _tx_timer_current_ptr++; +@ + ADD r0, r0, #4 @ Move to next timer +@ +@ /* Check for wraparound. */ +@ if (_tx_timer_current_ptr == _tx_timer_list_end) +@ + LDR r3, =_tx_timer_list_end @ Pickup address of timer list end + LDR r2, [r3] @ Pickup list end + CMP r0, r2 @ Are we at list end? + BNE __tx_timer_skip_wrap @ No, skip wraparound logic +@ +@ /* Wrap to beginning of list. */ +@ _tx_timer_current_ptr = _tx_timer_list_start; +@ + LDR r3, =_tx_timer_list_start @ Pickup address of timer list start + LDR r0, [r3] @ Set current pointer to list start +@ +__tx_timer_skip_wrap: +@ + STR r0, [r1] @ Store new current timer pointer +@ } +@ +__tx_timer_done: +@ +@ +@ /* See if anything has expired. */ +@ if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of expired flag + LDR r2, [r3] @ Pickup time-slice expired flag + CMP r2, #0 @ Did a time-slice expire? + BNE __tx_something_expired @ If non-zero, time-slice expired + LDR r1, =_tx_timer_expired @ Pickup address of other expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Did a timer expire? + BEQ __tx_timer_nothing_expired @ No, nothing expired +@ +__tx_something_expired: +@ +@ + STMDB sp!, {r0, lr} @ Save the lr register on the stack + @ and save r0 just to keep 8-byte alignment +@ +@ /* Did a timer expire? */ +@ if (_tx_timer_expired) +@ { +@ + LDR r1, =_tx_timer_expired @ Pickup address of expired flag + LDR r0, [r1] @ Pickup timer expired flag + CMP r0, #0 @ Check for timer expiration + BEQ __tx_timer_dont_activate @ If not set, skip timer activation +@ +@ /* Process timer expiration. */ +@ _tx_timer_expiration_process(); +@ + BL _tx_timer_expiration_process @ Call the timer expiration handling routine +@ +@ } +__tx_timer_dont_activate: +@ +@ /* Did time slice expire? */ +@ if (_tx_timer_expired_time_slice) +@ { +@ + LDR r3, =_tx_timer_expired_time_slice @ Pickup address of time-slice expired + LDR r2, [r3] @ Pickup the actual flag + CMP r2, #0 @ See if the flag is set + BEQ __tx_timer_not_ts_expiration @ No, skip time-slice processing +@ +@ /* Time slice interrupted thread. */ +@ _tx_thread_time_slice(); +@ + BL _tx_thread_time_slice @ Call time-slice processing +@ +@ } +@ +__tx_timer_not_ts_expiration: +@ + LDMIA sp!, {r0, lr} @ Recover lr register (r0 is just there for + @ the 8-byte stack alignment +@ +@ } +@ +__tx_timer_nothing_expired: +@ +#ifdef __THUMB_INTERWORK + BX lr @ Return to caller +#else + MOV pc, lr @ Return to caller +#endif +@ +@} + diff --git a/ports/cortex_r5/iar/example_build/azure_rtos.eww b/ports/cortex_r5/iar/example_build/azure_rtos.eww new file mode 100644 index 00000000..17e0d329 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/azure_rtos.eww @@ -0,0 +1,13 @@ + + + + + $WS_DIR$\sample_threadx.ewp + + + $WS_DIR$\tx.ewp + + + + + diff --git a/ports/cortex_r5/iar/example_build/cstartup.s b/ports/cortex_r5/iar/example_build/cstartup.s new file mode 100644 index 00000000..7a46bec0 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/cstartup.s @@ -0,0 +1,163 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Part one of the system initialization code, +;; contains low-level +;; initialization. +;; +;; Copyright 2007 IAR Systems. All rights reserved. +;; +;; $Revision: 49919 $ +;; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION IRQ_STACK:DATA:NOROOT(3) + SECTION FIQ_STACK:DATA:NOROOT(3) + SECTION CSTACK:DATA:NOROOT(3) + +; +; The module in this file are included in the libraries, and may be +; replaced by any user-defined modules that define the PUBLIC symbol +; __iar_program_start or a user defined start symbol. +; +; To override the cstartup defined in the library, simply add your +; modified version to the workbench project. + + SECTION .intvec:CODE:NOROOT(2) + + PUBLIC __vector + PUBLIC __iar_program_start + EXTERN Undefined_Handler + EXTERN SWI_Handler + EXTERN Prefetch_Handler + EXTERN Abort_Handler + EXTERN IRQ_Handler + EXTERN FIQ_Handler + + DATA + +__iar_init$$done: ; The vector table is not needed + ; until after copy initialization is done + +__vector: ; Make this a DATA label, so that stack usage + ; analysis doesn't consider it an uncalled fun + + ARM + + ; All default exception handlers (except reset) are + ; defined as weak symbol definitions. + ; If a handler is defined by the application it will take precedence. + LDR PC,Reset_Addr ; Reset + LDR PC,Undefined_Addr ; Undefined instructions + LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) + LDR PC,Prefetch_Addr ; Prefetch abort + LDR PC,Abort_Addr ; Data abort + DCD 0 ; RESERVED + LDR PC,IRQ_Addr ; IRQ + LDR PC,FIQ_Addr ; FIQ + + DATA + +Reset_Addr: DCD __iar_program_start +Undefined_Addr: DCD Undefined_Handler +SWI_Addr: DCD SWI_Handler +Prefetch_Addr: DCD Prefetch_Handler +Abort_Addr: DCD Abort_Handler +IRQ_Addr: DCD IRQ_Handler +FIQ_Addr: DCD FIQ_Handler + + +; -------------------------------------------------- +; ?cstartup -- low-level system initialization code. +; +; After a reset execution starts here, the mode is ARM, supervisor +; with interrupts disabled. +; + + + + SECTION .text:CODE:NOROOT(2) + + EXTERN __cmain + REQUIRE __vector + EXTWEAK __iar_init_core + EXTWEAK __iar_init_vfp + + + ARM + +__iar_program_start: +?cstartup: + +; +; Add initialization needed before setup of stackpointers here. +; + +; +; Initialize the stack pointers. +; The pattern below can be used for any of the exception stacks: +; FIQ, IRQ, SVC, ABT, UND, SYS. +; The USR mode uses the same stack as SYS. +; The stack segments must be defined in the linker command file, +; and be declared above. +; + + +; -------------------- +; Mode, correspords to bits 0-5 in CPSR + +#define MODE_MSK 0x1F ; Bit mask for mode bits in CPSR + +#define USR_MODE 0x10 ; User mode +#define FIQ_MODE 0x11 ; Fast Interrupt Request mode +#define IRQ_MODE 0x12 ; Interrupt Request mode +#define SVC_MODE 0x13 ; Supervisor mode +#define ABT_MODE 0x17 ; Abort mode +#define UND_MODE 0x1B ; Undefined Instruction mode +#define SYS_MODE 0x1F ; System mode + + MRS r0, cpsr ; Original PSR value + + ;; Set up the interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the fast interrupt stack pointer. + + BIC r0, r0, #MODE_MSK ; Clear the mode bits + ORR r0, r0, #FIQ_MODE ; Set FIR mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Set up the normal stack pointer. + + BIC r0 ,r0, #MODE_MSK ; Clear the mode bits + ORR r0 ,r0, #SYS_MODE ; Set System mode bits + MSR cpsr_c, r0 ; Change the mode + LDR sp, =SFE(CSTACK) ; End of CSTACK + BIC sp,sp,#0x7 ; Make sure SP is 8 aligned + + ;; Turn on core features assumed to be enabled. + FUNCALL __iar_program_start, __iar_init_core + BL __iar_init_core + + ;; Initialize VFP (if needed). + FUNCALL __iar_program_start, __iar_init_vfp + BL __iar_init_vfp + +;;; +;;; Add more initialization here +;;; + +;;; Continue to __cmain for C-level initialization. + + FUNCALL __iar_program_start, __cmain + B __cmain + + END diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.c b/ports/cortex_r5/iar/example_build/sample_threadx.c new file mode 100644 index 00000000..983109cc --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.c @@ -0,0 +1,376 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + + +/* Define byte pool memory. */ + +UCHAR byte_pool_memory[DEMO_BYTE_POOL_SIZE]; + + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", byte_pool_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.dep b/ports/cortex_r5/iar/example_build/sample_threadx.dep new file mode 100644 index 00000000..5dad90e2 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.dep @@ -0,0 +1,253 @@ + + + 4 + 811054824 + + Debug + + $PROJ_DIR$\Debug\Obj\sample_threadx.__cstat.et + $PROJ_DIR$\Debug\Exe\sample_threadx.out + $PROJ_DIR$\rti.h + $PROJ_DIR$\Debug\Obj\demo.r79 + $PROJ_DIR$\Debug\Obj\rti.pbi + $TOOLKIT_DIR$\inc\DLib_Threads.h + $PROJ_DIR$\sample_threadx.icf + $TOOLKIT_DIR$\inc\ysizet.h + $TOOLKIT_DIR$\inc\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\rti.__cstat.et + $TOOLKIT_DIR$\inc\DLib_Config_Normal.h + $PROJ_DIR$\Debug\List\cstartup.lst + $PROJ_DIR$\tx_initialize_low_level.s79 + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\DLib_Product_string.h + $TOOLKIT_DIR$\inc\intrinsics.h + $PROJ_DIR$\Debug\List\sample_threadx.map + $PROJ_DIR$\Debug\Obj\sample_threadx.pbd + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\List\tx_initialize_low_level.lst + $PROJ_DIR$\Debug\Obj\sample_threadx.o + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\lib\dl7Sx_tbn.a + $TOOLKIT_DIR$\inc\stdlib.h + $TOOLKIT_DIR$\inc\xencoding_limits.h + $PROJ_DIR$\Debug\Obj\tx_execution_profile.pbi + $PROJ_DIR$\Debug\Obj\tx_initialize_low_level.o + $TOOLKIT_DIR$\lib\rt7Sx_tb.a + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\cstartup.s + $PROJ_DIR$\Debug\Obj\rti.o + $PROJ_DIR$\Debug\Obj\TX_ILL.r79 + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\sample_threadx.c + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_initialize_low_level.s + $PROJ_DIR$\tx_execution_profile.c + $PROJ_DIR$\tx_port.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\lib\sh7Sxs_b.a + $TOOLKIT_DIR$\inc\yvals.h + $PROJ_DIR$\tx_cstartup.s79 + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Debug\Obj\tx_cstartup.r79 + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\lib\m7Sx_tbv.a + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\DEMO.C + $PROJ_DIR$\Debug\Obj\sample_threadx.xcl + $PROJ_DIR$\Debug\Obj\cstartup.o + $TOOLKIT_DIR$\inc\ycheck.h + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\cstartup.s79 + $TOOLKIT_DIR$\inc\DLib_Product.h + $TOOLKIT_DIR$\inc\string.h + $PROJ_DIR$\rti.c + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\TX_ILL.s79 + $PROJ_DIR$\Debug\Obj\tx_execution_profile.o + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + [ROOT_NODE] + + + ILINK + 1 17 + + + + + $PROJ_DIR$\Debug\Exe\sample_threadx.out + + + ILINK + 17 + + + + + ILINK + 6 52 22 34 28 41 29 48 24 + + + + + $PROJ_DIR$\tx_initialize_low_level.s79 + + + AARM + 28 21 + + + + + $PROJ_DIR$\cstartup.s + + + AARM + 52 12 + + + + + $PROJ_DIR$\sample_threadx.c + + + ICCARM + 22 + + + __cstat + 0 + + + BICOMP + 51 + + + + + ICCARM + 62 63 20 40 30 19 9 46 47 59 23 49 14 44 54 + + + + + $PROJ_DIR$\tx_initialize_low_level.s + + + AARM + 28 21 + + + + + $PROJ_DIR$\tx_execution_profile.c + + + ICCARM + 61 + + + BICOMP + 27 + + + + + ICCARM + 36 39 25 53 42 8 11 56 26 5 7 57 15 16 + + + BICOMP + 36 39 25 53 42 8 56 26 5 7 57 15 16 + + + + + $PROJ_DIR$\tx_cstartup.s79 + + + AARM + 45 + + + + + $PROJ_DIR$\DEMO.C + + + ICCARM + 3 + + + + + ICCARM + 36 39 + + + + + $PROJ_DIR$\cstartup.s79 + + + AARM + 52 + + + + + $PROJ_DIR$\rti.c + + + ICCARM + 32 + + + __cstat + 10 + + + BICOMP + 4 + + + + + ICCARM + 2 + + + BICOMP + 2 + + + + + $PROJ_DIR$\TX_ILL.s79 + + + AARM + 33 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.ewd b/ports/cortex_r5/iar/example_build/sample_threadx.ewd new file mode 100644 index 00000000..28a9ad4c --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 1 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.ewp b/ports/cortex_r5/iar/example_build/sample_threadx.ewp new file mode 100644 index 00000000..a7c609f4 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.ewp @@ -0,0 +1,2140 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.ewt b/ports/cortex_r5/iar/example_build/sample_threadx.ewt new file mode 100644 index 00000000..77fe620f --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.ewt @@ -0,0 +1,2791 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Common sources + + $PROJ_DIR$\cstartup.s + + + $PROJ_DIR$\sample_threadx.c + + + $PROJ_DIR$\Debug\Exe\tx.a + + + $PROJ_DIR$\tx_initialize_low_level.s + + + diff --git a/ports/cortex_r5/iar/example_build/sample_threadx.icf b/ports/cortex_r5/iar/example_build/sample_threadx.icf new file mode 100644 index 00000000..13723763 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/sample_threadx.icf @@ -0,0 +1,49 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x00000040; +define symbol __ICFEDIT_region_ROM_end__ = 0x0013FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x08000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x0802FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x200; +define symbol __ICFEDIT_size_svcstack__ = 0x100; +define symbol __ICFEDIT_size_irqstack__ = 0x100; +define symbol __ICFEDIT_size_fiqstack__ = 0x100; +define symbol __ICFEDIT_size_undstack__ = 0x100; +define symbol __ICFEDIT_size_abtstack__ = 0x100; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define symbol __region_DRAM_start__ = 0x80000000; +define symbol __region_DRAM_end__ = 0x807FFFFF; +define region DRAM_region = mem:[from __region_DRAM_start__ to __region_DRAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block SVC_STACK with alignment = 8, size = __ICFEDIT_size_svcstack__ { }; +define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; +define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { }; +define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { }; +define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK, + block UND_STACK, block ABT_STACK, block HEAP}; +place in DRAM_region { section DRAM }; + +place in RAM_region { last section FREE_MEM}; \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt b/ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt new file mode 100644 index 00000000..0923efcb --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/azure_rtos.wsdt @@ -0,0 +1,535 @@ + + + + + sample_threadx/Debug + tx/Debug + + sample_threadx + 1 + + + + + 21 + 2518 + 2 + + 0 + -1 + + + + 34001 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33038 + 33039 + 0 + + + + + 253 + 30 + 30 + 30 + + + <ws> + + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 010000004A0003DA000001000000578600000100000029810000020000001386000001000000259600000200000056840000010000005486000001000000158100000300000008B000000200000000DA000002000000268100000100000059920000010000000184000001000000108600005F000000239200000100000029E10000020000000A860000010000000F810000010000002081000001000000ED8000000100000008DA000001000000EA800000010000001D8100000100000001E10000010000000D800000010000000C8100001600000005DA00000100000003DC00000100000004860000010000009A86000001000000288100000100000002DA0000010000000384000005000000568600000600000017810000020000002496000001000000008400000100000007B000000100000014810000030000000C86000001000000008100000300000009860000010000001F810000010000005E86000003000000EC800000010000001A8600000100000003E10000010000000E8100000100000000E10000010000000B81000002000000E9800000010000001882000003000000588600000100000004DA000001000000148600002500000001DA000001000000239600000800000009B00000010000005586000001000000F4800000010000000086000001000000028400000100000011860000250000004681000029000000248100000100000003B0000001000000EE800000010000005D86000001000000EB800000010000000D810000020000000886000001000000168600000100000006DA000001000000E880000001000000 + + + 0A000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400000E84000030840000 + 0400048400004C000000068400004E0000000B8100001B0000000D8100001D000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 4294967295 + 0000000048040000000A000065050000 + 0000000031040000000A00004E050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34052 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 24 + 1880 + 501 + 125 + 2 + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\BuildLog.log + 0 + -1 + + + 34048 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 34056 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34057 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34058 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 764 + 127 + 1146 + 509 + 2 + + 0 + -1 + + + 34059 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 891 + 127 + 1528 + 2 + + 0 + -1 + + + 34062 + 000000001700000022010000C8000000 + 0400000049040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + + 0 + -1 + + + 34053 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + + + + + + + <Right-click on a symbol in the editor to show a call graph> + + + + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + File + Function + Line + + + 200 + 700 + 100 + + + + 34054 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34055 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + Check + File + Line + Message + Severity + + + 200 + 200 + 100 + 500 + 100 + + + + 34060 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 2 + $WS_DIR/SourceBrowseLog.log + 0 + -1 + + + 34061 + 000000001700000080020000A8000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 2 + + + 0 + + + C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\Debug\Obj\sample_threadx.pbw + + + File + Name + Scope + Symbol type + + + 300 + 300 + 300 + 300 + + + + 34063 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34064 + 000000001700000022010000C8000000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34065 + 00000000170000000601000078010000 + 0000000032000000450100002D040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 0000000014000000000000000010000001000000FFFFFFFFFFFFFFFF4501000032000000490100002D0400000100000002000010040000000100000091FFFFFFF1080000118500000000000000000000000000000000000001000000118500000100000011850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000108500000000000000000000000000000000000001000000108500000100000010850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000F85000000000000000000000000000000000000010000000F850000010000000F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000C85000000000000000000000000000000000000010000000C850000010000000C850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000058500000000000000000000000000000000000001000000058500000100000005850000000000000080000001000000FFFFFFFFFFFFFFFF000000002D040000000A000031040000010000000100001004000000010000009EFBFFFF6F000000FFFFFFFF07000000048500000085000008850000098500000A8500000B8500000E850000FFFF02000B004354616262656450616E6500800000010000000000000048040000000A0000650500000000000031040000000A00004E050000000000004080005607000000FFFEFF054200750069006C006400010000000485000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000085000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000885000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000985000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300000000000A85000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000000B85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000000E85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF0485000001000000FFFFFFFF04850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000100FFFF01001100434D4643546F6F6C426172427574746F6ED1840000000000000C000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B0018000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + FE020000000000002C0300001A000000 + 8192 + 0 + 0 + 24 + 0 + + + 1 + + + Main + 00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000040038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000004003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000004003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000400FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000004003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000040041000000FFFEFF000000000000000000000000000100000001000000018002810000000004001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000040030000000FFFEFF000000000000000000000000000100000001000000018027810000000004002E000000FFFEFF000000000000000000000000000100000001000000018028810000000004002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 0000000000000000FE0200001A000000 + 8192 + 0 + 0 + 744 + 0 + + + 1 + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + + + + 01000000030000000100000000000000000000000100000001000000FFFFFFFF00000000010000000100000000000000280000002800000000000000 + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat new file mode 100644 index 00000000..ed996cec --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 new file mode 100644 index 00000000..198168ed --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\common\bin\cspybat" -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\settings\sample_threadx.Debug.driver.xcl" +} diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl new file mode 100644 index 00000000..7f8b9b49 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R5" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE8" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl new file mode 100644 index 00000000..23f67303 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armsim2.dll" + +"C:\Users\nisohack\Documents\work\x-ware_libs\threadx\ports\cortex_r5\iar\example_build\Debug\Exe\sample_threadx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.crun b/ports/cortex_r5/iar/example_build/settings/sample_threadx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt new file mode 100644 index 00000000..43d2a650 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dbgdt @@ -0,0 +1,1797 @@ + + + + + + + 447 + 27 + 27 + 2010398909 + + + + + 2 + 0 + 0 + + + 1 + 0 + 0 + + + 47 + 1666 + + + 20 + 915 + 244 + 61 + + + + 2 + 0 + 0 + + + + + + 3 + 0 + 0 + + + 0 + 1 + 0 + + + + + + + + 2 + 0 + 0 + + + 187 + 100 + 100 + 100 + + + 21 + 50 + 142 + 120 + 170 + 80 + 100 + 100 + 100 + 80 + 95 + + + + + + + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 161 + 150 + 100 + 100 + + + + + + + + TabID-32281-8114 + Workspace + Workspace + + + <ws> + <ws>/sample_threadx + <ws>/sample_threadx/Common sources + <ws>/sample_threadx/Common sources/tx_cstartup.s79 + sample_threadx + sample_threadx/Output + sample_threadx/Output/sample_threadx.out + sample_threadx/Output/sample_threadx.out/Output + + + + + 0 + + + + + TabID-31758-8124 + Debug Log + Debug-Log + + + + TabID-9738-8128 + Build + Build + + + + TabID-20156-25745 + Breakpoints + Breakpoints + + + 0 + + + + + TabID-19697-5905 + Thread List + TX-THREAD + + 1 + + + + TabID-19175-5914 + Message Queues + TX-MESSAGEQUEUE + + + TabID-29400-5927 + Semaphores + TX-SEMAPHORE + + + TabID-6858-5940 + Mutexes + TX-MUTEX + + + TabID-6335-5950 + Byte Pools + TX-BYTEPOOL + + + TabID-16561-5963 + Block Pools + TX-BLOCKPOOL + + + TabID-26786-5976 + Timers + TX-TIMER + + + TabID-26264-5986 + Event Flag Groups + TX-EVENTFLAG + + + 0 + + + + + TabID-4531-19825 + Watch 1 + WATCH_1 + + + 0 + + + + + + TextEditor + $WS_DIR$\sample_threadx.c + 0 + 40 + 1720 + 1720 + + 0 + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + threadxarmplugin.enu1 + + + + + + + + + + -2 + -2 + 572 + 521 + -2 + -2 + 151 + 168 + 99473 + 181425 + 344532 + 619870 + + + + + + + + + + + -2 + -2 + 572 + 307 + -2 + -2 + 214 + 217 + 140975 + 234341 + 203557 + 619870 + + + + + + + + + + + -2 + -2 + 65 + 1520 + -2 + -2 + 1522 + 67 + 1002635 + 72354 + 99473 + 181425 + + + + + + + + + 63 + -2 + 261 + 1520 + -2 + 63 + 1522 + 198 + 1002635 + 213823 + 142292 + 213823 + + + + + + + + + + + + + 34048 + 34049 + 34050 + 34051 + 34052 + 34053 + 34054 + 34055 + 34056 + 34057 + 34058 + 34059 + 34060 + 34061 + 34062 + 34063 + 34064 + 34065 + 34066 + 34067 + 34068 + 34069 + 34070 + 34071 + 34072 + 34073 + 34074 + 34075 + 34076 + 34077 + 34078 + 34079 + 34080 + 34081 + 34082 + 34083 + 34084 + 34085 + 34086 + 34087 + 34088 + 34089 + 34090 + 34091 + 34092 + 34093 + 34094 + 34095 + 34096 + 34097 + 34098 + 34099 + 34100 + 34101 + 34102 + 34103 + 34104 + 34105 + 34106 + 34107 + 34108 + 34109 + 34110 + 34111 + 34112 + 34113 + 34114 + 34115 + 34116 + 34117 + 34118 + 34119 + 34120 + 34121 + 34122 + 34123 + 34124 + 34125 + 34126 + 34127 + + + + + 34000 + 34001 + 0 + + + + + 34390 + 34323 + 34398 + 34400 + 34397 + 34320 + 34321 + 34324 + 0 + + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + + Disassembly + _I0 + + + 500 + 20 + + + 0x3e94 + 0x9ec + 0x1c9c + IRQ_Handler + + 1 + 1 + + + 14 + 25 + + + 1 + 1 + 0 + 0 + 1 + 1 + 1 + E90000004A0003DA000001000000578600000100000029810000020000001386000001000000259600000200000056840000010000005486000001000000158100000300000008B000000200000000DA000002000000268100000100000059920000010000000184000001000000108600005F000000239200000100000029E10000020000000A860000010000000F810000010000002081000001000000ED8000000100000008DA000001000000EA800000010000001D8100000100000001E10000010000000D800000010000000C8100001600000005DA00000100000003DC00000100000004860000010000009A86000001000000288100000100000002DA0000010000000384000005000000568600000600000017810000020000002496000001000000008400000100000007B000000100000014810000030000000C86000001000000008100000300000009860000010000001F810000010000005E86000003000000EC800000010000001A8600000100000003E10000010000000E8100000600000000E10000010000000B81000002000000E9800000010000001882000003000000588600000100000004DA000001000000148600002500000001DA000001000000239600000800000009B00000010000005586000001000000F4800000010000000086000001000000028400000100000011860000250000004681000029000000248100000100000003B0000001000000EE800000010000005D86000001000000EB800000010000000D810000020000000886000001000000168600000100000006DA000001000000E880000001000000 + + + 41000D8400000F84000008840000FFFFFFFF54840000328100001C81000009840000D4840000E8800000838600005886000001B0000002B0000003B0000004B0000005B0000006B0000007B0000008B0000009B000000AB000000BB000000CB000000DB000000EB000000FB0000000B000002481000000880000018800000288000003880000048800000588000000DA000001DA000002DA000003DA000004DA000005DA000006DA000007DA000008DA000009DA00000ADA00000BDA00000CDA00000DDA00001B8600001C8600001D8600001E8600005A8600005B86000053860000A4860000A3860000439200001E920000289200002992000024960000259600001F960000 + 3A005786000018000000028600000F00000059920000240000001581000052000000268100005B000000239200000000000007E100006900000029E100006F0000000A8600002A00000004E10000670000001D920000110000000786000027000000008D00001D00000001E10000640000000D8000004400000004860000240000009A860000160000001781000054000000018600000E000000259200001900000000840000770000001481000051000000449200002200000000810000460000000E8400007F00000030840000810000001F9200001F00000009860000290000001A8600003100000003E100006600000025E100006D0000002D9200002100000006860000260000008E8600003A00000000E10000630000000B8100004C00000022E100006A000000698600003700000041E10000740000000386000010000000239600008700000055860000060000001681000053000000008600000D0000000E860000170000000B8600002B00000005E100006800000051840000850000000886000028000000C386000003000000A18600003B00000002E10000650000000D8100004E00000024E100006C0000002C9200002000000005860000250000001686000030000000C08600000A000000 + + + 0 + 0A0000000A0000006E0000006E000000 + 000000004E050000000A000061050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34051 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34052 + 34050000AF0400005606000060050000 + 04000000B5040000FC09000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 1 + + + 4294967295 + 00000000630000000601000028030000 + 000000004C0000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34053 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34060 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34062 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34063 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34064 + 7A0000005F0000009C01000010010000 + 04000000B5040000FC09000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34094 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34102 + 7A0000005F0000009C01000010010000 + 04000000B5040000C306000034050000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34054 + 7A0000005F000000FA020000F0000000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34055 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34056 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34057 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34058 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34059 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34061 + 7A0000005F00000080010000C0010000 + D504000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + 34065 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34066 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34067 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34068 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34069 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 0x080018c4 + 0x080001f8 + 0x08001cac + 0x080002f8 + + 0 + 134224072 + 134224072 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 8389003 + + + 34070 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34071 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34072 + 7A0000005F0000009C01000020010000 + 040000000A020000CD04000099020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34073 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34074 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34075 + 7A0000005F00000080010000C0010000 + C405000032000000A4060000B3020000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + Access + Current CPU Registers + Value + + + 180 + 180 + 180 + + + sctlr + + 0 + + + 34076 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34077 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34078 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34079 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34080 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34081 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34082 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34083 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34084 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34085 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34086 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34087 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34088 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34089 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34090 + 7A0000005F0000009C01000010010000 + 0000000002020000A4060000B3020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + ID + Max Stack Usage + Name + Priority + Run Count + Stack End + Stack Ptr + Stack Size + Stack Start + State + + + 125 + 125 + 100 + 65 + 75 + 125 + 125 + 75 + 125 + 100 + + + + 34091 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34092 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34093 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34095 + 7A0000005F00000080010000C0010000 + 040000004A000000020100008A020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + 34107 + 7A0000005F00000080010000C0010000 + 00000000600000000601000099040000 + 4096 + 0 + 0 + 32767 + 0 + + + 1 + + + 34096 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34097 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34098 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34099 + 7A0000005F0000009C01000010010000 + 000000000000000022010000B1000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34100 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34101 + 7A0000005F0000002802000020010000 + 0000000000000000AE010000C1000000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34103 + 7A0000005F00000080010000C0010000 + F50700004C000000000A000099040000 + 16384 + 0 + 0 + 32767 + 0 + + + 1 + + + + thread_0_counter + thread_1_counter + thread_2_counter + thread_3_counter + thread_4_counter + thread_5_counter + thread_6_counter + thread_7_counter + + + + Expression + Location + Type + Value + + + 173 + 150 + 100 + 100 + + + + 34104 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34105 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34106 + 7A0000005F00000080010000C0010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 000000007E000000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000003A85000000000000000000000000000000000000010000003A850000010000003A850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000398500000000000000000000000000000000000001000000398500000100000039850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000388500000000000000000000000000000000000001000000388500000100000038850000000000000040000001000000FFFFFFFFFFFFFFFFF10700004C000000F50700009904000001000000020000100400000001000000F2F8FFFF8E010000378500000000000000000000000000000000000001000000378500000100000037850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000358500000000000000000000000000000000000001000000358500000100000035850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000348500000000000000000000000000000000000001000000348500000100000034850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000338500000000000000000000000000000000000001000000338500000100000033850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000328500000000000000000000000000000000000001000000328500000100000032850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000318500000000000000000000000000000000000001000000318500000100000031850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000308500000000000000000000000000000000000001000000308500000100000030850000000000000010000001000000FFFFFFFFFFFFFFFF060100004C0000000A01000099040000010000000200001004000000010000000000000000000000FFFFFFFF010000003B850000FFFF02000B004354616262656450616E65001000000100000000000000630000000601000028030000000000004C0000000601000099040000000000004010005601000000FFFEFF0957006F0072006B0073007000610063006500010000003B85000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFF3B85000001000000FFFFFFFF3B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002D85000000000000000000000000000000000000010000002D850000010000002D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002C85000000000000000000000000000000000000010000002C850000010000002C850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000002B85000000000000000000000000000000000000010000002B850000010000002B850000000000000080000000000000FFFFFFFFFFFFFFFF00000000FE010000A4060000020200000000000001000000040000000100000000000000000000002A85000000000000000000000000000000000000010000002A850000010000002A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000298500000000000000000000000000000000000001000000298500000100000029850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000288500000000000000000000000000000000000001000000288500000100000028850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000278500000000000000000000000000000000000001000000278500000100000027850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000268500000000000000000000000000000000000001000000268500000100000026850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000258500000000000000000000000000000000000001000000258500000100000025850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000248500000000000000000000000000000000000001000000248500000100000024850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000238500000000000000000000000000000000000001000000238500000100000023850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000228500000000000000000000000000000000000001000000228500000100000022850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000218500000000000000000000000000000000000001000000218500000100000021850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000208500000000000000000000000000000000000001000000208500000100000020850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001F85000000000000000000000000000000000000010000001F850000010000001F850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001E85000000000000000000000000000000000000010000001E850000010000001E850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001D85000000000000000000000000000000000000010000001D850000010000001D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001C85000000000000000000000000000000000000010000001C850000010000001C850000000000000040000000000000FFFFFFFFFFFFFFFFC005000032000000C4050000B3020000000000000200000004000000010000001CFBFFFFFE0000001B85000000000000000000000000000000000000010000001B850000010000001B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000001A85000000000000000000000000000000000000010000001A850000010000001A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000198500000000000000000000000000000000000001000000198500000100000019850000000000000080000000000000FFFFFFFFFFFFFFFF00000000EE010000D1040000F2010000000000000100000004000000010000000000000000000000FFFFFFFF0400000015850000168500001785000018850000018000800000000000000000000009020000D1040000CA02000000000000F2010000D1040000B3020000000000004080004604000000FFFEFF084D0065006D006F007200790020003100000000001585000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003200000000001685000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003300000000001785000001000000FFFFFFFFFFFFFFFFFFFEFF084D0065006D006F007200790020003400000000001885000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF1585000001000000FFFFFFFF15850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000148500000000000000000000000000000000000001000000148500000100000014850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000138500000000000000000000000000000000000001000000138500000100000013850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000128500000000000000000000000000000000000001000000128500000100000012850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000118500000000000000000000000000000000000001000000118500000100000011850000000000000040000000000000FFFFFFFFFFFFFFFFD104000032000000D5040000B30200000000000002000000040000000100000000F9FFFFB50000000D85000000000000000000000000000000000000010000000D850000010000000D850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000000B85000000000000000000000000000000000000010000000B850000010000000B850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000000A85000000000000000000000000000000000000010000000A850000010000000A850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000098500000000000000000000000000000000000001000000098500000100000009850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000088500000000000000000000000000000000000001000000088500000100000008850000000000000010000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000078500000000000000000000000000000000000001000000078500000100000007850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000068500000000000000000000000000000000000001000000068500000100000006850000000000000080000001000000FFFFFFFFFFFFFFFF0000000099040000000A00009D040000010000000100001004000000010000000000000000000000FFFFFFFF08000000058500000C8500000E8500000F850000108500002E850000368500000485000001800080000001000000000000002C030000C7060000DD030000000000009D040000000A00004E050000000000004080005608000000FFFEFF054200750069006C006400000000000585000001000000FFFFFFFFFFFFFFFFFFFEFF094400650062007500670020004C006F006700010000000C85000001000000FFFFFFFFFFFFFFFFFFFEFF0C4400650063006C00610072006100740069006F006E007300000000000E85000001000000FFFFFFFFFFFFFFFFFFFEFF0A5200650066006500720065006E00630065007300000000000F85000001000000FFFFFFFFFFFFFFFFFFFEFF0D460069006E006400200069006E002000460069006C0065007300010000001085000001000000FFFFFFFFFFFFFFFFFFFEFF1541006D0062006900670075006F0075007300200044006500660069006E006900740069006F006E007300000000002E85000001000000FFFFFFFFFFFFFFFFFFFEFF0B54006F006F006C0020004F0075007400700075007400000000003685000001000000FFFFFFFFFFFFFFFFFFFEFF0B42007200650061006B0070006F0069006E0074007300010000000485000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF0585000001000000FFFFFFFF05850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000038500000000000000000000000000000000000001000000038500000100000003850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004A85000000000000000000000000000000000000010000004A850000010000004A850000000000000080000000000000FFFFFFFFFFFFFFFF0000000000020000A406000004020000000000000100000004000000010000000000000000000000498500000000000000000000000000000000000001000000498500000100000049850000000000000080000000000000FFFFFFFFFFFFFFFF00000000B4020000A4060000B8020000000000000100000004000000010000000000000000000000488500000000000000000000000000000000000001000000488500000100000048850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000468500000000000000000000000000000000000001000000468500000100000046850000000000000040000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000200000004000000010000000000000000000000458500000000000000000000000000000000000001000000458500000100000045850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000448500000000000000000000000000000000000001000000448500000100000044850000000000000020000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000438500000000000000000000000000000000000001000000438500000100000043850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000418500000000000000000000000000000000000001000000418500000100000041850000000000000080000000000000FFFFFFFFFFFFFFFF00000000000000000400000004000000000000000100000004000000010000000000000000000000408500000000000000000000000000000000000001000000408500000100000040850000000000000020000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003F85000000000000000000000000000000000000010000003F850000010000003F850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003E85000000000000000000000000000000000000010000003E850000010000003E850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000003D85000000000000000000000000000000000000010000003D850000010000003D850000000000000080000000000000FFFFFFFFFFFFFFFF0000000020020000A406000024020000000000000100000004000000010000000000000000000000FFFFFFFF010000004285000001800080000000000000000000003B020000A4060000CB0200000000000024020000A4060000B4020000000000004080004601000000FFFEFF11460075006E006300740069006F006E002000500072006F00660069006C0065007200000000004285000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF4285000001000000FFFFFFFF42850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004D85000000000000000000000000000000000000010000004D850000010000004D850000000000000080000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000001000000040000000100000000000000000000004C85000000000000000000000000000000000000010000004C850000010000004C850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000000040000000100000000000000000000004B85000000000000000000000000000000000000010000004B850000010000004B850000000000000040000000000000FFFFFFFFFFFFFFFF000000000000000004000000040000000000000002000010040000000100000000000000000000004F85000000000000000000000000000000000000010000004F850000010000004F850000000000000000000000000000 + + + CMSIS-Pack + 00200000010000000200FFFF01001100434D4643546F6F6C426172427574746F6ED0840000000004001C000000FFFEFF0000000000000000000000000001000000010000000180D1840000000000001E000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0A43004D005300490053002D005000610063006B002F000000 + + + 34048 + 0A0000000A0000006E0000006E000000 + F10300001A0000003604000034000000 + 8192 + 1 + 0 + 47 + 0 + + + 1 + + + Debug + 00200000010000000800FFFF01001100434D4643546F6F6C426172427574746F6E568600000000000033000000FFFEFF000000000000000000000000000100000001000000018013860000000000002F000000FFFEFF00000000000000000000000000010000000100000001805E8600000000000035000000FFFEFF0000000000000000000000000001000000010000000180608600000000000037000000FFFEFF00000000000000000000000000010000000100000001805D8600000000000034000000FFFEFF000000000000000000000000000100000001000000018010860000000000002D000000FFFEFF000000000000000000000000000100000001000000018011860000000004002E000000FFFEFF0000000000000000000000000001000000010000000180148600000000000030000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF0544006500620075006700B9000000 + + + 34049 + 0A0000000A0000006E0000006E000000 + 150300001A000000E403000034000000 + 8192 + 1 + 0 + 185 + 0 + + + 1 + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000004006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF020000 + + + 34050 + 0A0000000A0000006E0000006E000000 + 000000001A0000001503000034000000 + 8192 + 1 + 0 + 767 + 0 + + + 1 + + + 34108 + 4608000060000000F4090000F0000000 + 040000003C020000A00600009A020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34114 + 46080000600000006809000010010000 + 0000000038020000A4060000B4020000 + 4096 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34109 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34110 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34111 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34112 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34113 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34115 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34116 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 8192 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34117 + 46080000600000004C090000C0010000 + 00000000000000000601000060010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34118 + 4608000060000000F409000020010000 + 0000000000000000AE010000C0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34119 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34120 + 46080000600000006809000010010000 + 00000000B8020000A406000068030000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34121 + 46080000600000006809000010010000 + 0000000004020000A4060000B4020000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34122 + 46080000600000006809000010010000 + 000000000000000022010000B0000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34123 + 6E0100007B00000074020000DC010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + 34124 + 6E0100007B000000900200002C010000 + 000000000000000022010000B1000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + 34125 + 6E0100007B000000EE0300000C010000 + 00000000000000008002000091000000 + 32768 + 0 + 0 + 32767 + 0 + + + 0 + + + + 57600 + 57601 + 57603 + 33024 + 0 + 57607 + 0 + 57635 + 57634 + 57637 + 0 + 57643 + 57644 + 0 + 33090 + 33057 + 57636 + 57640 + 57641 + 33026 + 33065 + 33063 + 33064 + 33053 + 33054 + 0 + 33035 + 33036 + 34399 + 0 + 33055 + 33056 + 33094 + 0 + + + + 34127 + 00000000170000000601000078010000 + 00000000000000000601000061010000 + 16384 + 0 + 0 + 32767 + 0 + + + 0 + + + + Main + 00200000010000002100FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000064000000FFFEFF000000000000000000000000000100000001000000018001E100000000000065000000FFFEFF000000000000000000000000000100000001000000018003E100000000000067000000FFFEFF0000000000000000000000000001000000010000000180008100000000000048000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000006A000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004006C000000FFFEFF000000000000000000000000000100000001000000018022E10000000004006B000000FFFEFF000000000000000000000000000100000001000000018025E10000000000006E000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040071000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040072000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01000D005061737465436F6D626F426F784281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004005B000000FFFEFF000000000000000000000000000100000001000000018024E10000000000006D000000FFFEFF000000000000000000000000000100000001000000018028E10000000004006F000000FFFEFF000000000000000000000000000100000001000000018029E100000000000070000000FFFEFF000000000000000000000000000100000001000000018002810000000000004A000000FFFEFF000000000000000000000000000100000001000000018029810000000000005F000000FFFEFF000000000000000000000000000100000001000000018027810000000000005D000000FFFEFF000000000000000000000000000100000001000000018028810000000000005E000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040057000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040058000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004004E000000FFFEFF00000000000000000000000000010000000100000001800C810000000000004F000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000063000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001801F8100000000000059000000FFFEFF000000000000000000000000000100000001000000018020810000000000005A000000FFFEFF0000000000000000000000000001000000010000000180468100000000020061000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00FF7F0000 + + + 34126 + 0A0000000A0000006E0000006E000000 + 0000000000000000150300001A000000 + 8192 + 0 + 0 + 32767 + 0 + + + 1 + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx new file mode 100644 index 00000000..4c51289b --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.dnx @@ -0,0 +1,130 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 256381086 + + + 0 + + + HL512000 + + 0 + 2 + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + 0 + 1 + + + _ 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 + _ 0 + _ 0 + + + _ 0 + _ 0 + + + 0 + + + 1 + 0 + + + 0 + 0 + 0 + + + 0 + 1 + 0 + 0 + + + 0 + + + 1 + + + _ 0 + _ "" + + + _ 0 + _ "" + _ 0 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + _ 0 9999 0 9999 1 0 0 100 0 1 "IRQ 1 0x18 CPSR.I" + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups b/ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx.reggroups @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat b/ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat new file mode 100644 index 00000000..192ce771 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/sample_threadx_Debug_xds100board.dat @@ -0,0 +1,32 @@ +# config version=3.5 +$ sepk + pod_drvr=jioxds110.dll + pod_port=0 + pod_serial=HL512000 +$ / +$ product + title="Texas Instruments XDS110 USB" + alias=TI_XDS110_USB + name=XDS110 +$ / +$ uscif + tdoedge=FALL + tclk_program=DEFAULT + tclk_frequency=2.5MHz +$ / +$ dot7 + dts_usage=nothing +$ / +$ swd + swd_debug=disabled + swo_data=aux_uart +$ / +@ icepick family=icepick_c irbits=6 drbits=1 subpaths=2 + & port17 address=17 default=no custom=no force=yes pseudo=no + & port16 address=16 default=no custom=no force=yes pseudo=no + @ dap family=cs_dap irbits=4 drbits=1 subpaths=1 identify=0 + & portr4 type=debug address=0 default=no custom=no force=no pseudo=no + @ cortexr4 family=cortex_rxx irbits=0 drbits=0 address=0x80001000 identify=0x02000100 traceid=0x0 + & / + & / +# / diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat new file mode 100644 index 00000000..ddbce99e --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.bat @@ -0,0 +1,40 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +@echo off + +if not "%~1" == "" goto debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +goto end + +:debugFile + +@echo on + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" "--debug_file=%~1" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" + +@echo off +:end \ No newline at end of file diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 new file mode 100644 index 00000000..903a188b --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.cspy.ps1 @@ -0,0 +1,31 @@ +param([String]$debugfile = ""); + +# This powershell file has been generated by the IAR Embedded Workbench +# C - SPY Debugger, as an aid to preparing a command line for running +# the cspybat command line utility using the appropriate settings. +# +# Note that this file is generated every time a new debug session +# is initialized, so you may want to move or rename the file before +# making changes. +# +# You can launch cspybat by typing Powershell.exe -File followed by the name of this batch file, followed +# by the name of the debug file (usually an ELF / DWARF or UBROF file). +# +# Read about available command line parameters in the C - SPY Debugging +# Guide. Hints about additional command line parameters that may be +# useful in specific cases : +# --download_only Downloads a code image without starting a debug +# session afterwards. +# --silent Omits the sign - on message. +# --timeout Limits the maximum allowed execution time. +# + + +if ($debugfile -eq "") +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} +else +{ +& "C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\common\bin\cspybat" -f "C:\release\threadx\settings\tx.Debug.general.xcl" --debug_file=$debugfile --backend -f "C:\release\threadx\settings\tx.Debug.driver.xcl" +} diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl b/ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl new file mode 100644 index 00000000..7f8b9b49 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.driver.xcl @@ -0,0 +1,15 @@ +"--endian=big" + +"--cpu=Cortex-R5" + +"--fpu=VFPv3" + +"--semihosting" + +"--BE8" + +"--multicore_nr_of_cores=1" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl b/ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl new file mode 100644 index 00000000..d5205384 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.Debug.general.xcl @@ -0,0 +1,11 @@ +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\bin\armproc.dll" + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\bin\armsim2.dll" + +"C:\release\threadx\Debug\Exe\tx.out" + +--plugin="C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\bin\armbat.dll" + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.crun b/ports/cortex_r5/iar/example_build/settings/tx.crun new file mode 100644 index 00000000..d71ea555 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.crun @@ -0,0 +1,13 @@ + + + 1 + + + * + * + * + 0 + 1 + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.dbgdt b/ports/cortex_r5/iar/example_build/settings/tx.dbgdt new file mode 100644 index 00000000..9e08d965 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.dbgdt @@ -0,0 +1,4 @@ + + + + diff --git a/ports/cortex_r5/iar/example_build/settings/tx.dnx b/ports/cortex_r5/iar/example_build/settings/tx.dnx new file mode 100644 index 00000000..25e4c4ba --- /dev/null +++ b/ports/cortex_r5/iar/example_build/settings/tx.dnx @@ -0,0 +1,58 @@ + + + + 0 + 1 + 90 + 1 + 1 + 1 + main + 0 + 50 + + + 0 + 1 + + + 0 + 0 + 1 + 0 + 1 + 0 + + + 0 + 0 + 1 + 0 + 1 + + + 0 + + + 0 + + + 1 + + + 1 + 0 + 1 + 0 + 1 + + + 0 + 0 + + + 10000000 + 0 + 1 + + diff --git a/ports/cortex_r5/iar/example_build/tx.dep b/ports/cortex_r5/iar/example_build/tx.dep new file mode 100644 index 00000000..a10cf92c --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.dep @@ -0,0 +1,10476 @@ + + + 4 + 2479021136 + + Debug + + $PROJ_DIR$\tx_api.h + $PROJ_DIR$\tx_block_pool.h + $PROJ_DIR$\tx_block_pool_info_get.c + $PROJ_DIR$\tx_block_pool_delete.c + $PROJ_DIR$\tx_block_pool_initialize.c + $PROJ_DIR$\tx_block_allocate.c + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\tx_block_pool_prioritize.c + $PROJ_DIR$\tx_block_release.c + $PROJ_DIR$\tx_block_pool_performance_info_get.c + $PROJ_DIR$\tx_block_pool_cleanup.c + $PROJ_DIR$\tx_block_pool_create.c + $PROJ_DIR$\tx_byte_pool_info_get.c + $PROJ_DIR$\tx_event_flags_delete.c + $PROJ_DIR$\tx_event_flags_create.c + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\tx_mutex_create.c + $PROJ_DIR$\tx_byte_pool_search.c + $PROJ_DIR$\tx_event_flags_set_notify.c + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\tx_byte_pool_create.c + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\tx_byte_pool_prioritize.c + $PROJ_DIR$\tx_byte_release.c + $PROJ_DIR$\tx_byte_pool_initialize.c + $PROJ_DIR$\tx_byte_pool.h + $PROJ_DIR$\tx_event_flags.h + $PROJ_DIR$\tx_event_flags_get.c + $PROJ_DIR$\tx_event_flags_info_get.c + $PROJ_DIR$\tx_event_flags_performance_info_get.c + $PROJ_DIR$\tx_byte_allocate.c + $PROJ_DIR$\tx_event_flags_set.c + $PROJ_DIR$\tx_iar.c + $PROJ_DIR$\tx_initialize.h + $PROJ_DIR$\tx_initialize_high_level.c + $PROJ_DIR$\tx_event_flags_cleanup.c + $PROJ_DIR$\tx_initialize_kernel_enter.c + $PROJ_DIR$\tx_byte_pool_cleanup.c + $PROJ_DIR$\tx_initialize_kernel_setup.c + $PROJ_DIR$\tx_mutex_cleanup.c + $PROJ_DIR$\tx_event_flags_initialize.c + $PROJ_DIR$\tx_mutex.h + $PROJ_DIR$\tx_byte_pool_delete.c + $PROJ_DIR$\tx_queue.h + $PROJ_DIR$\tx_queue_create.c + $PROJ_DIR$\tx_queue_performance_info_get.c + $PROJ_DIR$\tx_semaphore_ceiling_put.c + $PROJ_DIR$\tx_semaphore_delete.c + $PROJ_DIR$\tx_mutex_info_get.c + $PROJ_DIR$\tx_semaphore.h + $PROJ_DIR$\tx_semaphore_get.c + $PROJ_DIR$\tx_queue_performance_system_info_get.c + $PROJ_DIR$\tx_semaphore_info_get.c + $PROJ_DIR$\tx_semaphore_initialize.c + $PROJ_DIR$\tx_queue_receive.c + $PROJ_DIR$\tx_queue_front_send.c + $PROJ_DIR$\tx_queue_delete.c + $PROJ_DIR$\tx_mutex_put.c + $PROJ_DIR$\tx_queue_info_get.c + $PROJ_DIR$\tx_queue_cleanup.c + $PROJ_DIR$\tx_mutex_initialize.c + $PROJ_DIR$\tx_mutex_priority_change.c + $PROJ_DIR$\tx_queue_prioritize.c + $PROJ_DIR$\tx_queue_send.c + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\tx_port.h + $PROJ_DIR$\tx_queue_send_notify.c + $PROJ_DIR$\tx_semaphore_cleanup.c + $PROJ_DIR$\tx_queue_flush.c + $PROJ_DIR$\tx_queue_initialize.c + $PROJ_DIR$\tx_mutex_delete.c + $PROJ_DIR$\tx_semaphore_create.c + $PROJ_DIR$\tx_mutex_get.c + $PROJ_DIR$\tx_mutex_performance_info_get.c + $PROJ_DIR$\tx_mutex_prioritize.c + $PROJ_DIR$\tx_thread_info_get.c + $PROJ_DIR$\tx_thread_resume.c + $PROJ_DIR$\tx_thread_schedule.s + $PROJ_DIR$\tx_thread_interrupt_restore.s + $PROJ_DIR$\tx_thread_entry_exit_notify.c + $PROJ_DIR$\tx_thread_sleep.c + $PROJ_DIR$\tx_thread.h + $PROJ_DIR$\tx_thread_preemption_change.c + $PROJ_DIR$\tx_semaphore_performance_info_get.c + $PROJ_DIR$\tx_semaphore_prioritize.c + $PROJ_DIR$\tx_thread_shell_entry.c + $PROJ_DIR$\tx_thread_performance_info_get.c + $PROJ_DIR$\tx_thread_stack_analyze.c + $PROJ_DIR$\tx_thread_stack_build.s + $PROJ_DIR$\tx_semaphore_put_notify.c + $PROJ_DIR$\tx_thread_performance_system_info_get.c + $PROJ_DIR$\tx_thread_context_restore.s + $PROJ_DIR$\tx_thread_create.c + $PROJ_DIR$\tx_thread_delete.c + $PROJ_DIR$\tx_thread_irq_nesting_end.s + $PROJ_DIR$\tx_thread_irq_nesting_start.s + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\tx_thread_priority_change.c + $PROJ_DIR$\tx_thread_identify.c + $PROJ_DIR$\tx_thread_interrupt_control.s + $PROJ_DIR$\tx_thread_interrupt_disable.s + $PROJ_DIR$\tx_thread_relinquish.c + $PROJ_DIR$\tx_thread_reset.c + $PROJ_DIR$\tx_thread_initialize.c + $PROJ_DIR$\tx_thread_context_save.s + $PROJ_DIR$\tx_semaphore_put.c + $PROJ_DIR$\tx_timer_info_get.c + $PROJ_DIR$\tx_time_get.c + $PROJ_DIR$\tx_timer.h + $PROJ_DIR$\tx_timer_deactivate.c + $PROJ_DIR$\tx_timer_expiration_process.c + $PROJ_DIR$\tx_timer_performance_info_get.c + $PROJ_DIR$\tx_thread_system_return.s + $PROJ_DIR$\tx_timer_interrupt.s + $PROJ_DIR$\tx_timer_thread_entry.c + $PROJ_DIR$\tx_trace_buffer_full_notify.c + $PROJ_DIR$\tx_thread_stack_error_handler.c + $PROJ_DIR$\tx_thread_system_preempt_check.c + $PROJ_DIR$\tx_thread_system_resume.c + $PROJ_DIR$\tx_thread_terminate.c + $PROJ_DIR$\tx_thread_time_slice_change.c + $PROJ_DIR$\tx_thread_timeout.c + $PROJ_DIR$\tx_thread_vectored_context_save.s + $PROJ_DIR$\tx_thread_time_slice.c + $PROJ_DIR$\tx_thread_stack_error_notify.c + $PROJ_DIR$\tx_thread_wait_abort.c + $PROJ_DIR$\tx_timer_activate.c + $PROJ_DIR$\tx_timer_initialize.c + $PROJ_DIR$\tx_timer_performance_system_info_get.c + $PROJ_DIR$\tx_timer_system_activate.c + $PROJ_DIR$\tx_timer_system_deactivate.c + $PROJ_DIR$\tx_trace.h + $PROJ_DIR$\tx_time_set.c + $PROJ_DIR$\tx_timer_change.c + $PROJ_DIR$\tx_timer_create.c + $PROJ_DIR$\tx_thread_system_suspend.c + $PROJ_DIR$\tx_thread_suspend.c + $PROJ_DIR$\tx_timer_delete.c + $PROJ_DIR$\tx_trace_disable.c + $PROJ_DIR$\tx_trace_isr_enter_insert.c + $PROJ_DIR$\txe_byte_pool_create.c + $PROJ_DIR$\tx_user.h + $PROJ_DIR$\txe_byte_pool_prioritize.c + $PROJ_DIR$\txe_event_flags_create.c + $PROJ_DIR$\txe_event_flags_delete.c + $PROJ_DIR$\txe_event_flags_get.c + $PROJ_DIR$\tx_trace_event_unfilter.c + $PROJ_DIR$\tx_trace_object_unregister.c + $PROJ_DIR$\txe_block_pool_prioritize.c + $PROJ_DIR$\tx_trace_event_filter.c + $PROJ_DIR$\txe_byte_pool_delete.c + $PROJ_DIR$\txe_event_flags_info_get.c + $PROJ_DIR$\txe_byte_pool_info_get.c + $PROJ_DIR$\txe_block_allocate.c + $PROJ_DIR$\txe_event_flags_set.c + $PROJ_DIR$\txe_event_flags_set_notify.c + $PROJ_DIR$\txe_byte_release.c + $PROJ_DIR$\txe_mutex_create.c + $PROJ_DIR$\tx_trace_initialize.c + $PROJ_DIR$\tx_trace_object_register.c + $PROJ_DIR$\tx_trace_user_event_insert.c + $PROJ_DIR$\tx_trace_interrupt_control.c + $PROJ_DIR$\txe_block_pool_create.c + $PROJ_DIR$\txe_byte_allocate.c + $PROJ_DIR$\txe_block_pool_info_get.c + $PROJ_DIR$\tx_trace_isr_exit_insert.c + $PROJ_DIR$\tx_trace_enable.c + $PROJ_DIR$\txe_block_release.c + $PROJ_DIR$\txe_block_pool_delete.c + $PROJ_DIR$\txe_thread_terminate.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_iar.pbi + $PROJ_DIR$\txe_timer_info_get.c + $PROJ_DIR$\txe_timer_deactivate.c + $PROJ_DIR$\Tx_byti.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.__cstat.et + $PROJ_DIR$\Tx_tto.c + $PROJ_DIR$\Tx_ini.h + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_control.o + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.pbi + $PROJ_DIR$\txe_thread_time_slice_change.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.pbi + $PROJ_DIR$\txe_thread_suspend.c + $PROJ_DIR$\txe_timer_change.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.pbi + $PROJ_DIR$\Txe_efd.c + $PROJ_DIR$\txe_timer_delete.c + $PROJ_DIR$\txe_thread_wait_abort.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send.pbi + $PROJ_DIR$\txe_timer_activate.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.__cstat.et + $PROJ_DIR$\txe_timer_create.c + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.__cstat.et + $PROJ_DIR$\txe_thread_preemption_change.c + $PROJ_DIR$\txe_thread_relinquish.c + $PROJ_DIR$\txe_mutex_info_get.c + $PROJ_DIR$\txe_queue_info_get.c + $PROJ_DIR$\txe_thread_entry_exit_notify.c + $PROJ_DIR$\txe_mutex_delete.c + $PROJ_DIR$\txe_queue_delete.c + $PROJ_DIR$\txe_semaphore_delete.c + $PROJ_DIR$\txe_semaphore_get.c + $PROJ_DIR$\txe_thread_priority_change.c + $PROJ_DIR$\txe_mutex_get.c + $PROJ_DIR$\txe_thread_reset.c + $PROJ_DIR$\txe_mutex_prioritize.c + $PROJ_DIR$\txe_semaphore_ceiling_put.c + $PROJ_DIR$\txe_thread_delete.c + $PROJ_DIR$\txe_thread_info_get.c + $PROJ_DIR$\txe_thread_resume.c + $PROJ_DIR$\txe_mutex_put.c + $PROJ_DIR$\txe_queue_create.c + $PROJ_DIR$\txe_queue_send_notify.c + $PROJ_DIR$\txe_queue_front_send.c + $PROJ_DIR$\txe_queue_flush.c + $PROJ_DIR$\txe_queue_send.c + $PROJ_DIR$\txe_semaphore_create.c + $PROJ_DIR$\txe_semaphore_prioritize.c + $PROJ_DIR$\txe_semaphore_put_notify.c + $PROJ_DIR$\txe_semaphore_put.c + $PROJ_DIR$\txe_semaphore_info_get.c + $PROJ_DIR$\txe_queue_prioritize.c + $PROJ_DIR$\txe_queue_receive.c + $PROJ_DIR$\txe_thread_create.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.pbi + $PROJ_DIR$\Tx_tc.c + $PROJ_DIR$\Tx_md.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_receive.o + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.o + $PROJ_DIR$\Txe_qig.c + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.o + $PROJ_DIR$\Txe_qs.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.pbi + $PROJ_DIR$\Txe_efg.c + $PROJ_DIR$\Txe_tt.c + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.o + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_iar.__cstat.et + $PROJ_DIR$\Tx_qr.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.pbi + $PROJ_DIR$\Tx_tsle.c + $PROJ_DIR$\Txe_tda.c + $PROJ_DIR$\Tx_mpri.c + $PROJ_DIR$\Debug\Obj\tx_mutex_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.o + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.__cstat.et + $PROJ_DIR$\Txe_spri.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.o + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.o + $PROJ_DIR$\Debug\Obj\tx_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.pbi + $PROJ_DIR$\Tx_tr.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_vectored_context_save.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.o + $PROJ_DIR$\Tx_timch.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.__cstat.et + $PROJ_DIR$\Tx_tsa.c + $PROJ_DIR$\Debug\Obj\txe_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.pbi + $PROJ_DIR$\Txe_trpc.c + $PROJ_DIR$\Tx_byta.c + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.o + $PROJ_DIR$\Tx_spri.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.pbi + $PROJ_DIR$\Tx_bpig.c + $PROJ_DIR$\Tx_mp.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.__cstat.et + $PROJ_DIR$\Txe_sp.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.o + $PROJ_DIR$\Tx_mi.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_sleep.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_queue_send.pbi + $PROJ_DIR$\Txe_tdel.c + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_mutex_create.pbi + $PROJ_DIR$\Txe_byta.c + $PROJ_DIR$\Txe_mpri.c + $PROJ_DIR$\Tx_thr.h + $PROJ_DIR$\Tx_bytpp.c + $PROJ_DIR$\Tx_sig.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.__cstat.et + $PROJ_DIR$\Txe_tig.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_schedule.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_change.o + $PROJ_DIR$\Debug\Obj\txe_timer_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\Debug\Obj\txe_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.o + $PROJ_DIR$\Tx_que.h + $PROJ_DIR$\Debug\Obj\tx_queue_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.o + $PROJ_DIR$\Debug\Obj\tx_mutex_put.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.o + $PROJ_DIR$\Txe_mig.c + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.pbi + $PROJ_DIR$\Tx_tte.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.o + $PROJ_DIR$\Txe_taa.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.pbi + $PROJ_DIR$\Tx_qi.c + $PROJ_DIR$\Debug\Obj\txe_block_allocate.o + $PROJ_DIR$\Txe_sig.c + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\Debug\Obj\txe_thread_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_save.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_receive.o + $PROJ_DIR$\Txe_sd.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_create.o + $PROJ_DIR$\Txe_timi.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\Tx_bpcle.c + $PROJ_DIR$\Tx_tda.c + $PROJ_DIR$\Debug\Obj\tx_thread_delete.__cstat.et + $PROJ_DIR$\Txe_qr.c + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_context_restore.o + $PROJ_DIR$\Tx_bytig.c + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.pbi + $PROJ_DIR$\Tx_efi.c + $PROJ_DIR$\Debug\Obj\txe_block_release.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_create.o + $PROJ_DIR$\Tx_bpd.c + $PROJ_DIR$\Debug\Obj\txe_timer_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_resume.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_get.__cstat.et + $PROJ_DIR$\Tx_bpp.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.o + $PROJ_DIR$\Debug\Obj\tx_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.pbi + $PROJ_DIR$\Tx_efg.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_return.o + $PROJ_DIR$\Tx_ike.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.o + $PROJ_DIR$\Tx_td.c + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\Debug\Obj\tx_timer_performance_info_get.__cstat.et + $PROJ_DIR$\Tx_twa.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.o + $PROJ_DIR$\Txe_md.c + $PROJ_DIR$\Debug\Obj\tx_thread_reset.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.__cstat.et + $PROJ_DIR$\Tx_qig.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_queue_front_send.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_resume.o + $PROJ_DIR$\Debug\Obj\txe_queue_create.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.o + $PROJ_DIR$\Tx_trel.c + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.pbi + $PROJ_DIR$\Tx_br.c + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.pbi + $PROJ_DIR$\Txe_bpd.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_timer_change.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_flush.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_context_restore.o + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.pbi + $PROJ_DIR$\Txe_mg.c + $PROJ_DIR$\Txe_bytd.c + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.o + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.pbi + $PROJ_DIR$\Tx_tra.c + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.__cstat.et + $PROJ_DIR$\Tx_mc.c + $PROJ_DIR$\Debug\Obj\tx_iar.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.o + $PROJ_DIR$\Debug\Obj\tx_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Txe_trel.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_create.pbi + $PROJ_DIR$\Txe_tmch.c + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_system_preempt_check.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_restore.o + $PROJ_DIR$\Debug\Obj\txe_thread_resume.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_create.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.o + $PROJ_DIR$\Tx_scle.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.pbi + $PROJ_DIR$\Txe_qf.c + $PROJ_DIR$\Debug\Obj\tx_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.__cstat.et + $PROJ_DIR$\Txe_bytg.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.pbi + $PROJ_DIR$\Txe_sc.c + $PROJ_DIR$\Txe_timd.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.__cstat.et + $PROJ_DIR$\Txe_mp.c + $PROJ_DIR$\Debug\Obj\tx_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.o + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.o + $PROJ_DIR$\Tx_ti.c + $PROJ_DIR$\Tx_bytr.c + $PROJ_DIR$\Txe_qp.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.pbi + $PROJ_DIR$\Tx_byts.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.o + $PROJ_DIR$\Tx_qp.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.o + $PROJ_DIR$\Debug\Obj\tx_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.o + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.o + $PROJ_DIR$\Tx_bytd.c + $PROJ_DIR$\Debug\Obj\tx_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_ceiling_put.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_put.pbi + $PROJ_DIR$\Tx_bpc.c + $PROJ_DIR$\Debug\Obj\txe_queue_flush.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\Tx_mpc.c + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_set.o + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.pbi + $PROJ_DIR$\Txe_twa.c + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.pbi + $PROJ_DIR$\Tx_tim.h + $PROJ_DIR$\Debug\Obj\tx_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.o + $PROJ_DIR$\Txe_bpp.c + $PROJ_DIR$\Debug\Obj\txe_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_activate.o + $PROJ_DIR$\Debug\Obj\tx_trace_event_unfilter.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.o + $PROJ_DIR$\Tx_tide.c + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_prioritize.pbi + $PROJ_DIR$\Tx_timd.c + $PROJ_DIR$\Txe_qd.c + $PROJ_DIR$\Debug\Obj\tx_thread_priority_change.o + $PROJ_DIR$\Txe_efc.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_thread_timeout.pbi + $PROJ_DIR$\Debug\Obj\txe_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.__cstat.et + $PROJ_DIR$\Txe_sg.c + $PROJ_DIR$\Tx_sg.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.o + $PROJ_DIR$\Txe_bytc.c + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Tx_mcle.c + $PROJ_DIR$\Tx_sp.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.__cstat.et + $PROJ_DIR$\tx_thread_fiq_context_restore.s + $PROJ_DIR$\Debug\Obj\txe_semaphore_delete.pbi + $PROJ_DIR$\Tx_sem.h + $PROJ_DIR$\Tx_sc.c + $PROJ_DIR$\Debug\Obj\tx_queue_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_resume.pbi + $PROJ_DIR$\Txe_mc.c + $PROJ_DIR$\Debug\Obj\txe_thread_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.pbi + $PROJ_DIR$\Tx_efcle.c + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.o + $PROJ_DIR$\tx_thread_fiq_context_save.s + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.o + $PROJ_DIR$\Tx_qs.c + $PROJ_DIR$\Tx_si.c + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.__cstat.et + $PROJ_DIR$\Txe_tpch.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_trace_object_register.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_resume.o + $PROJ_DIR$\Tx_ta.c + $PROJ_DIR$\Tx_tt.c + $PROJ_DIR$\Debug\Obj\txe_queue_send.__cstat.et + $PROJ_DIR$\Tx_timi.c + $PROJ_DIR$\Debug\Obj\tx_timer_thread_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.pbi + $PROJ_DIR$\Txe_qc.c + $PROJ_DIR$\Debug\Obj\tx_queue_delete.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.pbi + $PROJ_DIR$\Tx_byt.h + $PROJ_DIR$\Tx_qcle.c + $PROJ_DIR$\Debug\Obj\tx_timer_interrupt.o + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_create.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_initialize.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_create.pbi + $PROJ_DIR$\Tx_eve.h + $PROJ_DIR$\Debug\Obj\tx_queue_create.pbi + $PROJ_DIR$\Txe_br.c + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_interrupt_disable.o + $PROJ_DIR$\Debug\Obj\tx_mutex_initialize.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_entry_exit_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_prioritize.o + $PROJ_DIR$\Txe_efs.c + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.o + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_analyze.o + $PROJ_DIR$\Debug\Obj\tx_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send.__cstat.et + $PROJ_DIR$\Tx_bytcl.c + $PROJ_DIR$\Debug\Obj\tx_trace_event_filter.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_front_send.o + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.o + $PROJ_DIR$\Debug\Obj\txe_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_context_save.o + $PROJ_DIR$\Debug\Obj\tx_thread_stack_error_handler.o + $PROJ_DIR$\Txe_tra.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_activate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_search.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_thread_performance_info_get.__cstat.et + $PROJ_DIR$\Tx_efd.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_time_set.pbi + $PROJ_DIR$\Debug\Exe\tx.a + $PROJ_DIR$\Debug\Obj\tx_mutex_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_performance_system_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_create.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.pbi + $PROJ_DIR$\Txe_tmcr.c + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_enter.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_identify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.o + $PROJ_DIR$\Tx_timcr.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.__cstat.et + $PROJ_DIR$\Tx_qf.c + $PROJ_DIR$\Debug\Obj\txe_queue_receive.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_system_info_get.pbi + $PROJ_DIR$\Tx_timig.c + $PROJ_DIR$\Tx_ihl.c + $PROJ_DIR$\Debug\Obj\tx_trace_user_event_insert.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_system_info_get.o + $PROJ_DIR$\Tx_sd.c + $PROJ_DIR$\Debug\Obj\tx_mutex_put.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_activate.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_prioritize.pbi + $PROJ_DIR$\Txe_efig.c + $PROJ_DIR$\Debug\Obj\txe_timer_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.o + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.pbi + $PROJ_DIR$\Txe_bytp.c + $PROJ_DIR$\Tx_tdel.c + $PROJ_DIR$\Debug\Obj\tx_mutex_create.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.o + $PROJ_DIR$\Debug\Obj\tx_byte_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_initialize_kernel_setup.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_delete.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_relinquish.o + $PROJ_DIR$\Debug\Obj\tx_queue_performance_system_info_get.__cstat.et + $PROJ_DIR$\Tx_tse.c + $PROJ_DIR$\Debug\Obj\tx_timer_delete.o + $PROJ_DIR$\Debug\Obj\txe_thread_create.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_cleanup.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_get.o + $PROJ_DIR$\Tx_taa.c + $PROJ_DIR$\Debug\Obj\tx_trace_enable.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.o + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_put.pbi + $PROJ_DIR$\Tx_qc.c + $PROJ_DIR$\Debug\Obj\tx_mutex_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_timer_change.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.o + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.o + $PROJ_DIR$\Debug\Obj\txe_queue_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_byte_pool_create.o + $PROJ_DIR$\Txe_qfs.c + $PROJ_DIR$\Debug\Obj\txe_thread_reset.pbi + $PROJ_DIR$\Txe_bpc.c + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.pbi + $PROJ_DIR$\Txe_ttsc.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_create.o + $PROJ_DIR$\Debug\Obj\tx_timer_system_deactivate.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_semaphore_ceiling_put.o + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.pbi + $PROJ_DIR$\Debug\Obj\txe_mutex_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.pbi + $PROJ_DIR$\Txe_bpig.c + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.pbi + $PROJ_DIR$\Debug\Obj\tx_trace_enable.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_info_get.o + $PROJ_DIR$\Debug\Obj\txe_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_mutex_get.pbi + $PROJ_DIR$\Tx_efig.c + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_allocate.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_performance_system_info_get.o + $PROJ_DIR$\Debug\Obj\tx_thread_system_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_set.o + $PROJ_DIR$\Debug\Obj\tx_mutex_get.o + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + $PROJ_DIR$\Debug\Obj\tx_thread_irq_nesting_end.o + $PROJ_DIR$\Debug\Obj\tx_block_pool_performance_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_object_unregister.o + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.o + $PROJ_DIR$\Debug\Obj\txe_block_pool_prioritize.o + $PROJ_DIR$\Debug\Obj\tx_timer_deactivate.o + $PROJ_DIR$\Debug\Obj\txe_thread_preemption_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.pbi + $PROJ_DIR$\Debug\Obj\tx_block_pool_cleanup.__cstat.et + $PROJ_DIR$\Tx_tig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.pbi + $PROJ_DIR$\Debug\Obj\txe_semaphore_put.o + $PROJ_DIR$\Tx_mg.c + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_relinquish.pbi + $PROJ_DIR$\Tx_ttsc.c + $PROJ_DIR$\Tx_blo.h + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_release.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_reset.__cstat.et + $PROJ_DIR$\Tx_tpch.c + $PROJ_DIR$\Debug\Obj\txe_block_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\tx_timer_expiration_process.o + $PROJ_DIR$\Tx_efc.c + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_info_get.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tx_trace_interrupt_control.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_reset.o + $PROJ_DIR$\Txe_tsa.c + $PROJ_DIR$\Debug\Obj\txe_thread_priority_change.pbi + $PROJ_DIR$\Tx_qd.c + $PROJ_DIR$\Tx_tsus.c + $PROJ_DIR$\Debug\Obj\tx_semaphore_performance_info_get.o + $PROJ_DIR$\Txe_tc.c + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.o + $PROJ_DIR$\Tx_efs.c + $PROJ_DIR$\Debug\Obj\tx_thread_time_slice_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_suspend.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_buffer_full_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_exit_insert.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_change.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_performance_system_info_get.__cstat.et + $PROJ_DIR$\Tx_mig.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_create.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.__cstat.et + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\Debug\Obj\tx_thread_shell_entry.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_reset.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_prioritize.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_pool_delete.o + $PROJ_DIR$\Debug\Obj\tx_thread_fiq_nesting_start.o + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.o + $PROJ_DIR$\Tx_tts.c + $PROJ_DIR$\Debug\Obj\tx_thread_system_resume.pbi + $PROJ_DIR$\Tx_ba.c + $PROJ_DIR$\Tx_times.c + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\Tx_timeg.c + $PROJ_DIR$\Debug\Obj\txe_thread_entry_exit_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_isr_enter_insert.__cstat.et + $PROJ_DIR$\Tx_qfs.c + $PROJ_DIR$\Debug\Obj\txe_mutex_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_stack_build.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_cleanup.pbi + $PROJ_DIR$\Txe_ba.c + $PROJ_DIR$\Debug\Obj\tx_event_flags_cleanup.pbi + $PROJ_DIR$\Debug\Obj\tx_event_flags_initialize.pbi + $PROJ_DIR$\Debug\Obj\txe_byte_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_time_get.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Tx_bytc.c + $PROJ_DIR$\Debug\Obj\tx_time_set.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_delete.pbi + $PROJ_DIR$\Txe_bytr.c + $PROJ_DIR$\Debug\Obj\tx_timer_create.pbi + $PROJ_DIR$\Debug\Obj\txe_thread_info_get.o + $PROJ_DIR$\Debug\Obj\tx_semaphore_initialize.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_set_notify.__cstat.et + $PROJ_DIR$\Tx_tprch.c + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_event_flags_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_timer_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_pool_info_get.pbi + $PROJ_DIR$\Debug\Obj\tx_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\tx_block_release.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_semaphore_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_mutex_priority_change.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_mutex_create.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_byte_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_trace_disable.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_block_release.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_timer_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_event_flags_delete.pbi + $PROJ_DIR$\Tx_mut.h + $PROJ_DIR$\Debug\Obj\tx_timer_system_activate.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_delete.o + $PROJ_DIR$\Tx_bpi.c + $PROJ_DIR$\Debug\Obj\tx_trace_initialize.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_terminate.o + $PROJ_DIR$\Debug\Obj\tx_initialize_high_level.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_send_notify.o + $PROJ_DIR$\Debug\Obj\txe_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_event_flags_get.pbi + $PROJ_DIR$\Debug\Obj\tx_time_get.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_queue_flush.pbi + $PROJ_DIR$\Debug\Obj\tx_semaphore_put.pbi + $PROJ_DIR$\Debug\Obj\txe_queue_receive.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_thread_wait_abort.pbi + $PROJ_DIR$\Debug\Obj\txe_block_pool_info_get.__cstat.et + $PROJ_DIR$\Debug\Obj\txe_thread_time_slice_change.o + $PROJ_DIR$\Debug\Obj\txe_event_flags_delete.__cstat.et + $PROJ_DIR$\Debug\Obj\tx_byte_pool_initialize.pbi + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + $PROJ_DIR$\Debug\Obj\tx_misra.o + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + $PROJ_DIR$\..\src\tx_thread_context_save.s + $PROJ_DIR$\..\src\tx_timer_interrupt.s + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + $PROJ_DIR$\..\src\tx_iar.c + $PROJ_DIR$\..\src\tx_thread_context_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + $PROJ_DIR$\..\inc\tx_port.h + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + $PROJ_DIR$\..\src\tx_thread_system_return.s + $PROJ_DIR$\..\src\tx_thread_stack_build.s + $PROJ_DIR$\..\src\tx_thread_schedule.s + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\tx_block_pool_info_get.c + + + ICCARM + 557 + + + __cstat + 558 + + + BICOMP + 914 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 1 + + + BICOMP + 585 491 131 900 0 1 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_delete.c + + + ICCARM + 390 + + + __cstat + 580 + + + BICOMP + 282 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 1 + + + BICOMP + 585 1 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_initialize.c + + + ICCARM + 569 + + + __cstat + 793 + + + BICOMP + 286 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 900 1 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_allocate.c + + + ICCARM + 690 + + + __cstat + 373 + + + BICOMP + 817 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 1 + + + BICOMP + 65 900 81 491 585 0 1 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_performance_system_info_get.c + + + ICCARM + 795 + + + __cstat + 554 + + + BICOMP + 324 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 900 1 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_prioritize.c + + + ICCARM + 691 + + + __cstat + 442 + + + BICOMP + 621 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 1 + + + BICOMP + 585 1 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_release.c + + + ICCARM + 916 + + + __cstat + 924 + + + BICOMP + 262 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 1 + + + BICOMP + 585 1 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_performance_info_get.c + + + ICCARM + 800 + + + __cstat + 824 + + + BICOMP + 194 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 900 1 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_cleanup.c + + + ICCARM + 622 + + + __cstat + 831 + + + BICOMP + 459 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 1 + + + BICOMP + 65 900 81 491 585 0 1 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_block_pool_create.c + + + ICCARM + 431 + + + __cstat + 337 + + + BICOMP + 314 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 1 + + + BICOMP + 585 491 131 900 0 1 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_info_get.c + + + ICCARM + 460 + + + __cstat + 524 + + + BICOMP + 537 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 25 + + + BICOMP + 853 131 401 875 0 25 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_delete.c + + + ICCARM + 882 + + + __cstat + 903 + + + BICOMP + 926 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 26 + + + BICOMP + 26 401 425 131 413 848 887 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_create.c + + + ICCARM + 295 + + + __cstat + 317 + + + BICOMP + 527 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 26 + + + BICOMP + 65 401 425 131 413 848 887 0 26 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_performance_system_info_get.c + + + ICCARM + 818 + + + __cstat + 183 + + + BICOMP + 645 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 413 26 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_create.c + + + ICCARM + 450 + + + __cstat + 275 + + + BICOMP + 761 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 131 41 + + + BICOMP + 41 401 425 81 413 848 887 0 131 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_search.c + + + ICCARM + 710 + + + __cstat + 357 + + + BICOMP + 625 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 25 + + + BICOMP + 875 401 81 65 853 0 25 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_set_notify.c + + + ICCARM + 377 + + + __cstat + 841 + + + BICOMP + 756 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 26 + + + BICOMP + 65 401 425 131 413 848 887 0 26 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_performance_info_get.c + + + ICCARM + 764 + + + __cstat + 382 + + + BICOMP + 175 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 401 25 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_create.c + + + ICCARM + 788 + + + __cstat + 572 + + + BICOMP + 671 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 25 + + + BICOMP + 853 131 401 875 0 25 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 654 + + + __cstat + 189 + + + BICOMP + 452 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 401 25 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_prioritize.c + + + ICCARM + 403 + + + __cstat + 548 + + + BICOMP + 724 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 25 + + + BICOMP + 25 853 131 401 875 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_release.c + + + ICCARM + 842 + + + __cstat + 556 + + + BICOMP + 607 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 25 + + + BICOMP + 65 25 853 131 401 875 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_initialize.c + + + ICCARM + 279 + + + __cstat + 816 + + + BICOMP + 945 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 401 25 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_get.c + + + ICCARM + 344 + + + __cstat + 176 + + + BICOMP + 674 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 26 + + + BICOMP + 65 26 401 425 131 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_info_get.c + + + ICCARM + 852 + + + __cstat + 574 + + + BICOMP + 843 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 26 + + + BICOMP + 65 401 425 131 413 848 887 0 26 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_performance_info_get.c + + + ICCARM + 811 + + + __cstat + 424 + + + BICOMP + 758 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 413 26 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_allocate.c + + + ICCARM + 498 + + + __cstat + 369 + + + BICOMP + 712 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 25 + + + BICOMP + 875 401 65 81 853 0 25 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_set.c + + + ICCARM + 820 + + + __cstat + 606 + + + BICOMP + 741 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 26 + + + BICOMP + 26 401 425 131 413 848 887 0 81 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_iar.c + + + ICCARM + 517 + + + __cstat + 265 + + + BICOMP + 171 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 41 + + + BICOMP + 401 875 81 0 853 33 41 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_initialize_high_level.c + + + ICCARM + 753 + + + __cstat + 609 + + + BICOMP + 933 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 33 81 108 49 43 26 41 1 25 + + + BICOMP + 848 49 237 1 462 370 401 131 81 26 65 853 875 0 33 108 43 41 25 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_event_flags_cleanup.c + + + ICCARM + 170 + + + __cstat + 333 + + + BICOMP + 896 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 26 + + + BICOMP + 887 848 413 81 401 425 0 26 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_initialize_kernel_enter.c + + + ICCARM + 276 + + + __cstat + 723 + + + BICOMP + 439 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 853 108 33 401 875 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_byte_pool_cleanup.c + + + ICCARM + 752 + + + __cstat + 198 + + + BICOMP + 711 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 25 + + + BICOMP + 875 401 65 81 853 0 25 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_initialize_kernel_setup.c + + + ICCARM + 272 + + + __cstat + 765 + + + BICOMP + 684 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 + + + BICOMP + 900 33 491 585 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_cleanup.c + + + ICCARM + 731 + + + __cstat + 451 + + + BICOMP + 241 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 41 + + + BICOMP + 887 848 65 413 81 401 425 0 41 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_event_flags_initialize.c + + + ICCARM + 394 + + + __cstat + 840 + + + BICOMP + 897 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 413 26 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_byte_pool_delete.c + + + ICCARM + 605 + + + __cstat + 604 + + + BICOMP + 384 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 25 + + + BICOMP + 25 853 131 401 875 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + [ROOT_NODE] + + + IARCHIVE + 717 + + + + + $PROJ_DIR$\tx_queue_create.c + + + ICCARM + 536 + + + __cstat + 376 + + + BICOMP + 678 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 43 + + + BICOMP + 237 848 131 462 370 401 0 43 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_performance_info_get.c + + + ICCARM + 480 + + + __cstat + 264 + + + BICOMP + 232 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 462 370 43 237 848 0 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_ceiling_put.c + + + ICCARM + 804 + + + __cstat + 495 + + + BICOMP + 308 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 65 49 491 131 900 0 81 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_delete.c + + + ICCARM + 766 + + + __cstat + 603 + + + BICOMP + 541 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_info_get.c + + + ICCARM + 746 + + + __cstat + 865 + + + BICOMP + 195 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 41 + + + BICOMP + 401 425 131 413 848 887 0 41 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_get.c + + + ICCARM + 774 + + + __cstat + 730 + + + BICOMP + 247 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_performance_system_info_get.c + + + ICCARM + 348 + + + __cstat + 769 + + + BICOMP + 493 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 462 370 43 237 848 0 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_info_get.c + + + ICCARM + 434 + + + __cstat + 506 + + + BICOMP + 253 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 49 + + + BICOMP + 65 585 491 131 900 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_initialize.c + + + ICCARM + 908 + + + __cstat + 635 + + + BICOMP + 363 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 900 49 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_receive.c + + + ICCARM + 406 + + + __cstat + 597 + + + BICOMP + 260 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_front_send.c + + + ICCARM + 367 + + + __cstat + 471 + + + BICOMP + 482 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_delete.c + + + ICCARM + 664 + + + __cstat + 640 + + + BICOMP + 454 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_put.c + + + ICCARM + 378 + + + __cstat + 745 + + + BICOMP + 781 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 413 848 887 0 81 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_info_get.c + + + ICCARM + 693 + + + __cstat + 742 + + + BICOMP + 412 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 43 + + + BICOMP + 237 848 131 462 370 401 0 43 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_cleanup.c + + + ICCARM + 773 + + + __cstat + 754 + + + BICOMP + 532 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 43 + + + BICOMP + 401 462 370 81 65 237 848 0 43 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_initialize.c + + + ICCARM + 683 + + + __cstat + 576 + + + BICOMP + 391 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 848 413 41 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_priority_change.c + + + ICCARM + 345 + + + __cstat + 920 + + + BICOMP + 698 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 41 + + + BICOMP + 887 65 848 413 81 401 425 0 41 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_prioritize.c + + + ICCARM + 560 + + + __cstat + 588 + + + BICOMP + 748 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_send.c + + + ICCARM + 519 + + + __cstat + 699 + + + BICOMP + 346 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_performance_system_info_get.c + + + ICCARM + 340 + + + __cstat + 694 + + + BICOMP + 736 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 848 413 41 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_send_notify.c + + + ICCARM + 915 + + + __cstat + 613 + + + BICOMP + 686 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 43 + + + BICOMP + 237 65 848 131 462 370 401 0 43 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_cleanup.c + + + ICCARM + 644 + + + __cstat + 726 + + + BICOMP + 894 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 49 + + + BICOMP + 65 900 81 491 585 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_queue_flush.c + + + ICCARM + 500 + + + __cstat + 733 + + + BICOMP + 938 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 43 + + + BICOMP + 237 43 848 131 462 370 401 0 81 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_queue_initialize.c + + + ICCARM + 240 + + + __cstat + 328 + + + BICOMP + 290 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 462 370 43 237 848 0 65 853 875 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_mutex_delete.c + + + ICCARM + 703 + + + __cstat + 718 + + + BICOMP + 550 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 413 848 887 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_create.c + + + ICCARM + 320 + + + __cstat + 236 + + + BICOMP + 720 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 49 + + + BICOMP + 65 585 491 131 900 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_get.c + + + ICCARM + 821 + + + __cstat + 271 + + + BICOMP + 814 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 65 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_performance_info_get.c + + + ICCARM + 783 + + + __cstat + 780 + + + BICOMP + 662 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 848 413 41 401 425 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_mutex_prioritize.c + + + ICCARM + 487 + + + __cstat + 261 + + + BICOMP + 615 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 41 + + + BICOMP + 41 401 425 131 413 848 887 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_info_get.c + + + ICCARM + 256 + + + __cstat + 520 + + + BICOMP + 443 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_resume.c + + + ICCARM + 656 + + + __cstat + 435 + + + BICOMP + 641 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 33 + + + BICOMP + 491 33 585 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_schedule.s + + + AARM + 359 + + + + + $PROJ_DIR$\tx_thread_interrupt_restore.s + + + AARM + 534 + + + + + $PROJ_DIR$\tx_thread_entry_exit_notify.c + + + ICCARM + 180 + + + __cstat + 631 + + + BICOMP + 685 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 65 131 853 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_sleep.c + + + ICCARM + 342 + + + __cstat + 311 + + + BICOMP + 252 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 401 425 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_preemption_change.c + + + ICCARM + 301 + + + __cstat + 358 + + + BICOMP + 570 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 65 401 131 853 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_semaphore_performance_info_get.c + + + ICCARM + 860 + + + __cstat + 336 + + + BICOMP + 721 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 900 49 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_semaphore_prioritize.c + + + ICCARM + 393 + + + __cstat + 732 + + + BICOMP + 801 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_shell_entry.c + + + ICCARM + 728 + + + __cstat + 876 + + + BICOMP + 595 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_performance_info_get.c + + + ICCARM + 511 + + + __cstat + 713 + + + BICOMP + 508 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_stack_analyze.c + + + ICCARM + 696 + + + __cstat + 380 + + + BICOMP + 296 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 65 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_stack_build.s + + + AARM + 893 + + + + + $PROJ_DIR$\tx_semaphore_put_notify.c + + + ICCARM + 362 + + + __cstat + 620 + + + BICOMP + 440 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 49 + + + BICOMP + 585 65 491 131 900 0 49 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_performance_system_info_get.c + + + ICCARM + 258 + + + __cstat + 589 + + + BICOMP + 719 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_context_restore.s + + + AARM + 507 + + + + + $PROJ_DIR$\tx_thread_create.c + + + ICCARM + 483 + + + __cstat + 543 + + + BICOMP + 676 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 33 + + + BICOMP + 491 33 585 131 900 0 81 413 848 401 425 887 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_delete.c + + + ICCARM + 688 + + + __cstat + 416 + + + BICOMP + 751 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_end.s + + + AARM + 823 + + + + + $PROJ_DIR$\tx_thread_irq_nesting_start.s + + + AARM + 257 + + + + + $PROJ_DIR$\tx_semaphore_performance_system_info_get.c + + + ICCARM + 743 + + + __cstat + 626 + + + BICOMP + 396 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 900 49 491 585 0 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_priority_change.c + + + ICCARM + 618 + + + __cstat + 501 + + + BICOMP + 591 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 65 853 0 81 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_identify.c + + + ICCARM + 577 + + + __cstat + 727 + + + BICOMP + 319 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 65 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_interrupt_control.s + + + AARM + 179 + + + + + $PROJ_DIR$\tx_thread_interrupt_disable.s + + + AARM + 682 + + + + + $PROJ_DIR$\tx_thread_relinquish.c + + + ICCARM + 768 + + + __cstat + 522 + + + BICOMP + 687 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 65 401 425 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_reset.c + + + ICCARM + 467 + + + __cstat + 331 + + + BICOMP + 877 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_initialize.c + + + ICCARM + 647 + + + __cstat + 381 + + + BICOMP + 675 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 + + + BICOMP + 462 81 65 0 491 585 33 848 401 425 887 900 413 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_context_save.s + + + AARM + 705 + + + + + $PROJ_DIR$\tx_semaphore_put.c + + + ICCARM + 634 + + + __cstat + 708 + + + BICOMP + 939 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 49 + + + BICOMP + 585 49 491 131 900 0 81 65 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_info_get.c + + + ICCARM + 559 + + + __cstat + 913 + + + BICOMP + 813 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 401 425 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_time_get.c + + + ICCARM + 438 + + + __cstat + 937 + + + BICOMP + 899 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 401 425 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_deactivate.c + + + ICCARM + 828 + + + __cstat + 479 + + + BICOMP + 792 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 65 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_expiration_process.c + + + ICCARM + 849 + + + __cstat + 420 + + + BICOMP + 277 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 + + + BICOMP + 401 425 108 65 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_performance_info_get.c + + + ICCARM + 316 + + + __cstat + 463 + + + BICOMP + 453 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_system_return.s + + + AARM + 457 + + + + + $PROJ_DIR$\tx_timer_interrupt.s + + + AARM + 669 + + + + + $PROJ_DIR$\tx_timer_thread_entry.c + + + ICCARM + 512 + + + __cstat + 661 + + + BICOMP + 565 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 + + + BICOMP + 401 425 65 108 413 848 887 0 81 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_buffer_full_notify.c + + + ICCARM + 547 + + + __cstat + 868 + + + BICOMP + 836 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_stack_error_handler.c + + + ICCARM + 706 + + + __cstat + 523 + + + BICOMP + 385 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 81 401 875 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_system_preempt_check.c + + + ICCARM + 280 + + + __cstat + 474 + + + BICOMP + 533 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 65 81 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_system_resume.c + + + ICCARM + 315 + + + __cstat + 355 + + + BICOMP + 884 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 81 + + + BICOMP + 887 848 81 413 131 401 425 0 108 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_terminate.c + + + ICCARM + 932 + + + __cstat + 847 + + + BICOMP + 587 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 401 425 0 81 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_time_slice_change.c + + + ICCARM + 254 + + + __cstat + 864 + + + BICOMP + 190 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 108 + + + BICOMP + 887 848 108 413 131 401 425 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_timeout.c + + + ICCARM + 529 + + + __cstat + 538 + + + BICOMP + 623 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 401 425 81 65 413 848 887 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_vectored_context_save.s + + + AARM + 291 + + + + + $PROJ_DIR$\tx_thread_time_slice.c + + + ICCARM + 448 + + + __cstat + 304 + + + BICOMP + 397 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 131 + + + BICOMP + 887 848 131 413 108 401 425 0 81 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_stack_error_notify.c + + + ICCARM + 312 + + + __cstat + 321 + + + BICOMP + 499 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 853 65 81 401 875 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_thread_wait_abort.c + + + ICCARM + 293 + + + __cstat + 779 + + + BICOMP + 941 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_timer_activate.c + + + ICCARM + 601 + + + __cstat + 709 + + + BICOMP + 747 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_initialize.c + + + ICCARM + 374 + + + __cstat + 469 + + + BICOMP + 181 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 401 425 81 413 848 887 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_performance_system_info_get.c + + + ICCARM + 578 + + + __cstat + 871 + + + BICOMP + 680 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_system_activate.c + + + ICCARM + 251 + + + __cstat + 652 + + + BICOMP + 928 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 108 413 848 887 0 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_system_deactivate.c + + + ICCARM + 387 + + + __cstat + 799 + + + BICOMP + 300 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 401 65 108 413 848 887 0 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_time_set.c + + + ICCARM + 590 + + + __cstat + 902 + + + BICOMP + 716 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 401 425 0 108 65 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_change.c + + + ICCARM + 571 + + + __cstat + 870 + + + BICOMP + 784 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 65 413 131 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_timer_create.c + + + ICCARM + 410 + + + __cstat + 281 + + + BICOMP + 906 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 65 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_system_suspend.c + + + ICCARM + 819 + + + __cstat + 689 + + + BICOMP + 575 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 81 + + + BICOMP + 887 848 81 413 131 401 425 0 108 900 491 585 65 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_thread_suspend.c + + + ICCARM + 697 + + + __cstat + 515 + + + BICOMP + 436 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_timer_delete.c + + + ICCARM + 771 + + + __cstat + 925 + + + BICOMP + 267 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 108 + + + BICOMP + 887 848 413 131 65 401 425 0 108 900 491 585 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_disable.c + + + ICCARM + 502 + + + __cstat + 923 + + + BICOMP + 470 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_isr_enter_insert.c + + + ICCARM + 449 + + + __cstat + 890 + + + BICOMP + 666 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 65 401 131 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_byte_pool_create.c + + + ICCARM + 798 + + + __cstat + 757 + + + BICOMP + 740 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 25 + + + BICOMP + 401 875 900 33 491 585 0 108 413 848 81 25 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_byte_pool_prioritize.c + + + ICCARM + 564 + + + __cstat + 335 + + + BICOMP + 288 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 65 401 900 25 491 585 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_event_flags_create.c + + + ICCARM + 468 + + + __cstat + 285 + + + BICOMP + 873 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 26 + + + BICOMP + 65 848 887 108 853 33 401 425 0 81 26 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_event_flags_delete.c + + + ICCARM + 573 + + + __cstat + 944 + + + BICOMP + 833 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 26 + + + BICOMP + 401 65 26 81 413 848 0 108 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_event_flags_get.c + + + ICCARM + 323 + + + __cstat + 911 + + + BICOMP + 936 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 26 + + + BICOMP + 401 26 81 65 413 848 0 108 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\tx_trace_event_unfilter.c + + + ICCARM + 307 + + + __cstat + 477 + + + BICOMP + 602 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_object_unregister.c + + + ICCARM + 825 + + + __cstat + 408 + + + BICOMP + 593 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_block_pool_prioritize.c + + + ICCARM + 827 + + + __cstat + 379 + + + BICOMP + 794 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 65 900 1 491 585 0 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_event_filter.c + + + ICCARM + 611 + + + __cstat + 341 + + + BICOMP + 701 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_byte_pool_delete.c + + + ICCARM + 880 + + + __cstat + 427 + + + BICOMP + 426 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 25 + + + BICOMP + 65 887 848 25 853 81 401 425 0 108 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_event_flags_info_get.c + + + ICCARM + 549 + + + __cstat + 297 + + + BICOMP + 912 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 65 848 853 26 401 425 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_byte_pool_info_get.c + + + ICCARM + 862 + + + __cstat + 898 + + + BICOMP + 513 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 25 + + + BICOMP + 875 65 401 900 25 491 585 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_block_allocate.c + + + ICCARM + 399 + + + __cstat + 504 + + + BICOMP + 521 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 1 + + + BICOMP + 1 65 853 81 401 875 0 108 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_event_flags_set.c + + + ICCARM + 441 + + + __cstat + 330 + + + BICOMP + 484 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 853 26 401 425 0 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_event_flags_set_notify.c + + + ICCARM + 629 + + + __cstat + 909 + + + BICOMP + 866 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 26 + + + BICOMP + 887 848 853 26 401 425 0 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_byte_release.c + + + ICCARM + 812 + + + __cstat + 922 + + + BICOMP + 518 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 25 + + + BICOMP + 401 875 108 900 33 491 585 0 81 25 413 848 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_create.c + + + ICCARM + 673 + + + __cstat + 921 + + + BICOMP + 349 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 41 + + + BICOMP + 65 848 887 108 853 33 401 425 0 81 462 237 370 491 41 900 413 585 875 + + + + + $PROJ_DIR$\tx_trace_initialize.c + + + ICCARM + 539 + + + __cstat + 931 + + + BICOMP + 327 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_object_register.c + + + ICCARM + 598 + + + __cstat + 447 + + + BICOMP + 655 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 853 0 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_user_event_insert.c + + + ICCARM + 329 + + + __cstat + 475 + + + BICOMP + 739 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_interrupt_control.c + + + ICCARM + 826 + + + __cstat + 854 + + + BICOMP + 437 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 81 + + + BICOMP + 875 401 131 853 0 81 65 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_block_pool_create.c + + + ICCARM + 665 + + + __cstat + 544 + + + BICOMP + 235 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 1 + + + BICOMP + 108 900 33 491 585 0 81 1 413 848 401 425 887 65 462 237 853 370 875 + + + + + $PROJ_DIR$\txe_byte_allocate.c + + + ICCARM + 481 + + + __cstat + 429 + + + BICOMP + 704 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 25 + + + BICOMP + 401 875 900 33 491 585 0 108 413 848 81 25 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_block_pool_info_get.c + + + ICCARM + 238 + + + __cstat + 942 + + + BICOMP + 526 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 65 900 1 491 585 0 413 848 401 425 887 462 237 853 370 875 + + + + + $PROJ_DIR$\tx_trace_isr_exit_insert.c + + + ICCARM + 284 + + + __cstat + 389 + + + BICOMP + 869 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 65 401 131 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\tx_trace_enable.c + + + ICCARM + 810 + + + __cstat + 546 + + + BICOMP + 776 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 131 + + + BICOMP + 875 401 131 65 853 0 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_block_release.c + + + ICCARM + 423 + + + __cstat + 472 + + + BICOMP + 383 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 1 + + + BICOMP + 237 848 1 462 370 491 0 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_block_pool_delete.c + + + ICCARM + 846 + + + __cstat + 610 + + + BICOMP + 830 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 1 + + + BICOMP + 65 1 853 81 401 875 0 108 462 237 370 848 900 413 491 585 425 887 + + + + + $PROJ_DIR$\txe_thread_terminate.c + + + ICCARM + 473 + + + __cstat + 255 + + + BICOMP + 444 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 65 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_timer_info_get.c + + + ICCARM + 365 + + + __cstat + 200 + + + BICOMP + 343 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 65 401 108 853 848 887 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_timer_deactivate.c + + + ICCARM + 553 + + + __cstat + 750 + + + BICOMP + 455 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 65 401 108 853 848 887 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\Tx_byti.c + + + ICCARM + 0 65 667 + + + + + $PROJ_DIR$\Tx_tto.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\txe_thread_time_slice_change.c + + + ICCARM + 943 + + + __cstat + 505 + + + BICOMP + 322 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 65 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_suspend.c + + + ICCARM + 851 + + + __cstat + 867 + + + BICOMP + 185 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_timer_change.c + + + ICCARM + 364 + + + __cstat + 303 + + + BICOMP + 497 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 491 108 585 33 65 900 401 875 0 81 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\Txe_efd.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\txe_timer_delete.c + + + ICCARM + 594 + + + __cstat + 624 + + + BICOMP + 433 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 425 401 81 853 848 887 0 108 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_wait_abort.c + + + ICCARM + 763 + + + __cstat + 917 + + + BICOMP + 935 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_timer_activate.c + + + ICCARM + 465 + + + __cstat + 283 + + + BICOMP + 600 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 + + + BICOMP + 425 65 401 108 853 848 887 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_timer_create.c + + + ICCARM + 476 + + + __cstat + 608 + + + BICOMP + 361 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 491 108 585 33 900 401 875 0 81 413 848 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_preemption_change.c + + + ICCARM + 368 + + + __cstat + 829 + + + BICOMP + 809 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 900 401 875 0 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_relinquish.c + + + ICCARM + 250 + + + __cstat + 273 + + + BICOMP + 837 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 900 401 875 0 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_info_get.c + + + ICCARM + 715 + + + __cstat + 892 + + + BICOMP + 302 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 65 848 853 41 401 425 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_queue_info_get.c + + + ICCARM + 245 + + + __cstat + 531 + + + BICOMP + 672 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 65 43 413 848 0 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_entry_exit_notify.c + + + ICCARM + 243 + + + __cstat + 889 + + + BICOMP + 807 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 900 401 875 0 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_delete.c + + + ICCARM + 428 + + + __cstat + 681 + + + BICOMP + 904 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 41 + + + BICOMP + 401 65 41 81 413 848 0 108 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_delete.c + + + ICCARM + 929 + + + __cstat + 874 + + + BICOMP + 787 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 65 237 43 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_delete.c + + + ICCARM + 492 + + + __cstat + 242 + + + BICOMP + 637 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 49 + + + BICOMP + 585 65 49 491 81 900 401 875 0 108 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_semaphore_get.c + + + ICCARM + 767 + + + __cstat + 802 + + + BICOMP + 278 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 49 + + + BICOMP + 585 49 491 81 900 401 875 0 108 65 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_priority_change.c + + + ICCARM + 778 + + + __cstat + 496 + + + BICOMP + 857 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 65 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_get.c + + + ICCARM + 614 + + + __cstat + 445 + + + BICOMP + 386 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 41 + + + BICOMP + 65 848 887 108 853 33 401 425 0 81 41 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_reset.c + + + ICCARM + 855 + + + __cstat + 844 + + + BICOMP + 790 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 108 + + + BICOMP + 425 401 81 853 848 887 0 108 65 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_mutex_prioritize.c + + + ICCARM + 785 + + + __cstat + 806 + + + BICOMP + 805 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 41 + + + BICOMP + 887 65 848 853 41 401 425 0 462 237 370 491 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_ceiling_put.c + + + ICCARM + 263 + + + __cstat + 409 + + + BICOMP + 581 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 237 848 49 462 370 491 0 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_delete.c + + + ICCARM + 338 + + + __cstat + 879 + + + BICOMP + 430 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 491 585 81 65 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_info_get.c + + + ICCARM + 907 + + + __cstat + 803 + + + BICOMP + 489 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_thread_resume.c + + + ICCARM + 485 + + + __cstat + 371 + + + BICOMP + 535 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 81 + + + BICOMP + 65 491 585 81 900 401 875 0 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_mutex_put.c + + + ICCARM + 305 + + + __cstat + 318 + + + BICOMP + 582 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 41 + + + BICOMP + 401 65 875 41 900 33 491 585 0 81 413 848 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_create.c + + + ICCARM + 299 + + + __cstat + 292 + + + BICOMP + 486 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 108 81 43 + + + BICOMP + 401 108 413 848 0 43 900 491 585 875 33 81 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_send_notify.c + + + ICCARM + 934 + + + __cstat + 919 + + + BICOMP + 796 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 43 413 848 0 65 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_front_send.c + + + ICCARM + 702 + + + __cstat + 366 + + + BICOMP + 184 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 237 43 65 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_queue_flush.c + + + ICCARM + 567 + + + __cstat + 584 + + + BICOMP + 755 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 65 43 413 848 0 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_send.c + + + ICCARM + 334 + + + __cstat + 659 + + + BICOMP + 196 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 237 43 65 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_create.c + + + ICCARM + 786 + + + __cstat + 918 + + + BICOMP + 259 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 49 + + + BICOMP + 237 108 848 33 462 370 491 0 81 49 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_prioritize.c + + + ICCARM + 530 + + + __cstat + 360 + + + BICOMP + 421 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 65 237 848 49 462 370 491 0 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_put_notify.c + + + ICCARM + 695 + + + __cstat + 725 + + + BICOMP + 777 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 237 848 49 462 370 491 0 65 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_put.c + + + ICCARM + 834 + + + __cstat + 503 + + + BICOMP + 289 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 65 237 848 49 462 370 491 0 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_semaphore_info_get.c + + + ICCARM + 372 + + + __cstat + 762 + + + BICOMP + 405 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 49 + + + BICOMP + 65 237 848 49 462 370 491 0 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_queue_prioritize.c + + + ICCARM + 649 + + + __cstat + 878 + + + BICOMP + 306 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 43 + + + BICOMP + 401 65 43 413 848 0 900 491 585 875 462 237 853 370 425 887 + + + + + $PROJ_DIR$\txe_queue_receive.c + + + ICCARM + 239 + + + __cstat + 940 + + + BICOMP + 735 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 108 81 43 + + + BICOMP + 237 43 65 848 108 462 370 491 0 81 401 853 425 887 900 413 585 875 + + + + + $PROJ_DIR$\txe_thread_create.c + + + ICCARM + 402 + + + __cstat + 772 + + + BICOMP + 643 + + + + + ICCARM + 0 65 900 848 401 585 853 370 491 237 462 425 413 887 875 33 81 108 + + + BICOMP + 875 401 900 108 491 585 33 413 848 0 81 65 462 237 853 370 425 887 + + + + + $PROJ_DIR$\Tx_tc.c + + + ICCARM + 0 65 352 178 + + + + + $PROJ_DIR$\Tx_md.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Txe_qig.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Txe_qs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_efg.c + + + ICCARM + 0 65 178 352 596 677 + + + + + $PROJ_DIR$\Txe_tt.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_qr.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_tsle.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_tda.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_mpri.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Txe_spri.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Tx_tr.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_timch.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_tsa.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_trpc.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_byta.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Tx_spri.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Tx_bpig.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_mp.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Txe_sp.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Tx_mi.c + + + ICCARM + 0 65 927 + + + + + $PROJ_DIR$\Txe_tdel.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_byta.c + + + ICCARM + 0 65 178 352 596 667 + + + + + $PROJ_DIR$\Txe_mpri.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Tx_bytpp.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_sig.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Txe_tig.c + + + ICCARM + 0 65 596 352 + + + + + $PROJ_DIR$\Txe_mig.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Tx_tte.c + + + ICCARM + 0 65 596 352 + + + + + $PROJ_DIR$\Txe_taa.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qi.c + + + ICCARM + 0 65 375 + + + + + $PROJ_DIR$\Txe_sig.c + + + ICCARM + 0 65 352 638 + + + + + $PROJ_DIR$\Txe_sd.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_timi.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_bpcle.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_tda.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Txe_qr.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_bytig.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_efi.c + + + ICCARM + 0 65 677 + + + + + $PROJ_DIR$\Tx_bpd.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_bpp.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_efg.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Tx_ike.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_td.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_twa.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_md.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Tx_qig.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Tx_trel.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_br.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Txe_bpd.c + + + ICCARM + 0 65 178 352 596 839 + + + + + $PROJ_DIR$\Txe_mg.c + + + ICCARM + 0 65 178 352 596 927 + + + + + $PROJ_DIR$\Txe_bytd.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Tx_tra.c + + + ICCARM + 0 65 352 178 + + + + + $PROJ_DIR$\Tx_mc.c + + + ICCARM + 0 65 927 + + + + + $PROJ_DIR$\Txe_trel.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_tmch.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_scle.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_qf.c + + + ICCARM + 0 65 375 + + + + + $PROJ_DIR$\Txe_bytg.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Txe_sc.c + + + ICCARM + 0 65 178 352 596 638 + + + + + $PROJ_DIR$\Txe_timd.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_mp.c + + + ICCARM + 0 65 352 596 178 927 + + + + + $PROJ_DIR$\Tx_ti.c + + + ICCARM + 0 65 178 352 + + + + + $PROJ_DIR$\Tx_bytr.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Txe_qp.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Tx_byts.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_qp.c + + + ICCARM + 0 65 352 375 + + + + + $PROJ_DIR$\Tx_bytd.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Tx_bpc.c + + + ICCARM + 0 65 839 + + + + + $PROJ_DIR$\Tx_mpc.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Txe_twa.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_bpp.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_tide.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_timd.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Txe_qd.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_efc.c + + + ICCARM + 0 65 178 352 596 677 + + + + + $PROJ_DIR$\Txe_sg.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Tx_sg.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_bytc.c + + + ICCARM + 0 65 178 352 596 667 + + + + + $PROJ_DIR$\Tx_mcle.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Tx_sp.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\tx_thread_fiq_context_restore.s + + + AARM + 418 + + + + + $PROJ_DIR$\Tx_sc.c + + + ICCARM + 0 65 638 + + + + + $PROJ_DIR$\Txe_mc.c + + + ICCARM + 0 65 178 352 596 927 + + + + + $PROJ_DIR$\Tx_efcle.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\tx_thread_fiq_context_save.s + + + AARM + 404 + + + + + $PROJ_DIR$\Tx_qs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_si.c + + + ICCARM + 0 65 638 + + + + + $PROJ_DIR$\Txe_tpch.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_ta.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_tt.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_timi.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_qc.c + + + ICCARM + 0 65 178 352 596 375 + + + + + $PROJ_DIR$\Tx_qcle.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_end.s + + + AARM + 188 + + + + + $PROJ_DIR$\Txe_br.c + + + ICCARM + 0 65 839 + + + + + $PROJ_DIR$\Txe_efs.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Tx_bytcl.c + + + ICCARM + 0 65 352 596 667 + + + + + $PROJ_DIR$\Txe_tra.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_efd.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Debug\Exe\tx.a + + + IARCHIVE + 690 622 431 390 557 569 800 795 691 916 498 752 788 605 460 279 764 654 403 710 842 170 295 882 344 852 394 811 818 820 377 517 753 276 272 976 731 450 703 821 746 683 783 340 487 345 378 773 536 664 500 367 693 240 480 348 560 406 519 915 804 644 320 766 774 434 908 860 743 393 634 362 507 705 483 688 180 577 256 647 179 682 534 823 257 511 258 301 618 768 467 656 359 728 342 696 893 706 312 697 280 315 457 819 932 448 254 529 291 293 438 590 601 571 410 828 771 849 559 374 669 316 578 251 387 512 547 502 810 611 307 539 826 449 284 598 825 329 399 665 846 238 827 423 481 798 880 862 564 812 468 573 323 549 441 629 673 428 614 715 785 305 299 929 567 702 245 649 239 334 934 263 786 492 767 372 530 834 695 402 338 243 907 368 778 250 855 485 851 473 943 763 465 364 476 553 594 365 + + + + + $PROJ_DIR$\Txe_tmcr.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_timcr.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qf.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_timig.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_ihl.c + + + ICCARM + 0 65 178 352 596 638 375 677 839 667 927 + + + + + $PROJ_DIR$\Tx_sd.c + + + ICCARM + 0 65 352 596 638 + + + + + $PROJ_DIR$\Txe_efig.c + + + ICCARM + 0 65 352 677 + + + + + $PROJ_DIR$\Txe_bytp.c + + + ICCARM + 0 65 352 667 + + + + + $PROJ_DIR$\Tx_tdel.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_tse.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_taa.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qc.c + + + ICCARM + 0 65 375 + + + + + $PROJ_DIR$\Txe_qfs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_bpc.c + + + ICCARM + 0 65 178 352 596 839 + + + + + $PROJ_DIR$\Txe_ttsc.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Txe_bpig.c + + + ICCARM + 0 65 352 839 + + + + + $PROJ_DIR$\Tx_efig.c + + + ICCARM + 0 65 352 677 + + + + + $PROJ_DIR$\tx_thread_fiq_nesting_start.s + + + AARM + 881 + + + + + $PROJ_DIR$\Tx_tig.c + + + ICCARM + 0 65 596 352 + + + + + $PROJ_DIR$\Tx_mg.c + + + ICCARM + 0 65 352 596 927 + + + + + $PROJ_DIR$\Tx_ttsc.c + + + ICCARM + 0 65 352 596 + + + + + $PROJ_DIR$\Tx_tpch.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_efc.c + + + ICCARM + 0 65 677 + + + + + $PROJ_DIR$\Txe_tsa.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_qd.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Tx_tsus.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Txe_tc.c + + + ICCARM + 0 65 178 352 596 + + + + + $PROJ_DIR$\Tx_efs.c + + + ICCARM + 0 65 352 596 677 + + + + + $PROJ_DIR$\Tx_mig.c + + + ICCARM + 0 65 352 927 + + + + + $PROJ_DIR$\Tx_tts.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_ba.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_times.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_timeg.c + + + ICCARM + 0 65 596 + + + + + $PROJ_DIR$\Tx_qfs.c + + + ICCARM + 0 65 352 596 375 + + + + + $PROJ_DIR$\Txe_ba.c + + + ICCARM + 0 65 352 596 839 + + + + + $PROJ_DIR$\Tx_bytc.c + + + ICCARM + 0 65 667 + + + + + $PROJ_DIR$\Txe_bytr.c + + + ICCARM + 0 65 178 352 596 667 + + + + + $PROJ_DIR$\Tx_tprch.c + + + ICCARM + 0 65 352 + + + + + $PROJ_DIR$\Tx_bpi.c + + + ICCARM + 0 65 839 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + ICCARM + 340 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + ICCARM + 487 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + ICCARM + 753 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 962 974 968 954 972 969 970 964 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + ICCARM + 345 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + ICCARM + 773 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + ICCARM + 731 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + ICCARM + 820 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + ICCARM + 378 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + ICCARM + 276 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + ICCARM + 377 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + ICCARM + 272 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + ICCARM + 976 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + ICCARM + 703 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + ICCARM + 450 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 953 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + ICCARM + 821 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + ICCARM + 683 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + ICCARM + 746 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + ICCARM + 783 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + ICCARM + 665 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + ICCARM + 798 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + ICCARM + 827 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + ICCARM + 846 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + ICCARM + 862 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + ICCARM + 549 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + ICCARM + 441 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + ICCARM + 329 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + ICCARM + 573 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + ICCARM + 673 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + ICCARM + 428 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + ICCARM + 614 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + ICCARM + 299 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + ICCARM + 929 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + ICCARM + 702 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + ICCARM + 245 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + ICCARM + 880 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + ICCARM + 564 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + ICCARM + 812 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + ICCARM + 715 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + ICCARM + 629 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + ICCARM + 785 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + ICCARM + 305 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 970 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + ICCARM + 567 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + ICCARM + 649 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + ICCARM + 399 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + ICCARM + 423 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + ICCARM + 238 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + ICCARM + 481 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + ICCARM + 468 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + ICCARM + 323 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + ICCARM + 800 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + ICCARM + 788 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + ICCARM + 403 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + ICCARM + 710 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + ICCARM + 852 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + ICCARM + 811 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + ICCARM + 279 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + ICCARM + 431 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + ICCARM + 752 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + ICCARM + 295 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + ICCARM + 795 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + ICCARM + 622 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + ICCARM + 557 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + ICCARM + 691 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + ICCARM + 690 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + ICCARM + 916 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + ICCARM + 605 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + ICCARM + 764 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + ICCARM + 498 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + ICCARM + 460 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + ICCARM + 654 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + ICCARM + 842 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 947 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + ICCARM + 170 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + ICCARM + 882 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + ICCARM + 344 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + ICCARM + 394 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + ICCARM + 818 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 969 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + ICCARM + 390 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + ICCARM + 569 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 964 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + ICCARM + 485 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + ICCARM + 473 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + ICCARM + 239 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + ICCARM + 943 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + ICCARM + 465 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + ICCARM + 364 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + ICCARM + 763 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + ICCARM + 553 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + ICCARM + 594 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + ICCARM + 530 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + ICCARM + 365 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + ICCARM + 851 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + ICCARM + 476 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + ICCARM + 907 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + ICCARM + 334 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + ICCARM + 934 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + ICCARM + 786 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + ICCARM + 834 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + ICCARM + 695 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + ICCARM + 263 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + ICCARM + 338 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + ICCARM + 767 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + ICCARM + 243 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + ICCARM + 492 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + ICCARM + 368 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + ICCARM + 372 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + ICCARM + 778 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + ICCARM + 402 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + ICCARM + 250 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + ICCARM + 855 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + ICCARM + 560 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + AARM + 291 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + ICCARM + 406 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + ICCARM + 367 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + AARM + 823 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + ICCARM + 519 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + ICCARM + 915 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + ICCARM + 804 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + AARM + 705 + + + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + AARM + 669 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + AARM + 179 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + ICCARM + 664 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + ICCARM + 644 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + ICCARM + 320 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 954 + + + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + AARM + 257 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + ICCARM + 693 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 972 + + + + + $PROJ_DIR$\..\src\tx_iar.c + + + ICCARM + 517 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 970 + + + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + AARM + 507 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + ICCARM + 536 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + ICCARM + 240 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + ICCARM + 500 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 972 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + ICCARM + 480 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + AARM + 534 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + ICCARM + 348 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 972 + + + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + AARM + 682 + + + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + AARM + 457 + + + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + AARM + 893 + + + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + AARM + 359 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + ICCARM + 647 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 962 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + ICCARM + 301 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + ICCARM + 618 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + ICCARM + 467 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + ICCARM + 696 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + ICCARM + 312 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + ICCARM + 688 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + ICCARM + 768 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + ICCARM + 908 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + ICCARM + 697 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + ICCARM + 656 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 962 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + ICCARM + 315 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + ICCARM + 280 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + ICCARM + 362 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + ICCARM + 434 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + ICCARM + 706 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + ICCARM + 511 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + ICCARM + 258 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + ICCARM + 743 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + ICCARM + 860 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + ICCARM + 256 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + ICCARM + 728 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + ICCARM + 819 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + ICCARM + 342 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + ICCARM + 774 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + ICCARM + 766 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + ICCARM + 393 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + ICCARM + 634 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 954 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + ICCARM + 483 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 962 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + ICCARM + 180 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + ICCARM + 577 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + ICCARM + 448 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + ICCARM + 512 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + ICCARM + 601 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + ICCARM + 559 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + ICCARM + 387 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + ICCARM + 251 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + ICCARM + 547 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + ICCARM + 502 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + ICCARM + 539 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + ICCARM + 254 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + ICCARM + 316 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + ICCARM + 590 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + ICCARM + 284 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + ICCARM + 598 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + ICCARM + 825 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + ICCARM + 374 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + ICCARM + 810 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + ICCARM + 826 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + ICCARM + 578 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + ICCARM + 932 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + ICCARM + 571 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + ICCARM + 438 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + ICCARM + 449 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + ICCARM + 828 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + ICCARM + 771 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + ICCARM + 611 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + ICCARM + 529 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 974 968 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + ICCARM + 307 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + ICCARM + 293 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + ICCARM + 849 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 968 974 + + + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + ICCARM + 410 + + + + + ICCARM + 957 1087 900 848 401 585 853 370 491 237 462 425 413 887 875 953 968 + + + + + + Release + + + [MULTI_TOOL] + IARCHIVE + + + [REBUILD_ALL] + + + diff --git a/ports/cortex_r5/iar/example_build/tx.ewd b/ports/cortex_r5/iar/example_build/tx.ewd new file mode 100644 index 00000000..23d5eff1 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/ports/cortex_r5/iar/example_build/tx.ewp b/ports/cortex_r5/iar/example_build/tx.ewp new file mode 100644 index 00000000..06b41982 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.ewp @@ -0,0 +1,2764 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + Coder + 0 + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r5/iar/example_build/tx.ewt b/ports/cortex_r5/iar/example_build/tx.ewt new file mode 100644 index 00000000..016f76bc --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx.ewt @@ -0,0 +1,3415 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 263 + + 263 + + 0 + + 1 + 600 + 0 + 4 + 0 + 1 + 100 + + + 1.7.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + inc + + $PROJ_DIR$\..\..\..\..\common\inc\tx_api.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_block_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_byte_pool.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_event_flags.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_initialize.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_mutex.h + + + $PROJ_DIR$\..\inc\tx_port.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_queue.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_semaphore.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_thread.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_timer.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_trace.h + + + $PROJ_DIR$\..\..\..\..\common\inc\tx_user.h + + + + src + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_pool_search.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_event_flags_set_notify.c + + + $PROJ_DIR$\..\src\tx_iar.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_high_level.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_enter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_initialize_kernel_setup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_misra.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_cleanup.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_semaphore_put_notify.c + + + $PROJ_DIR$\..\src\tx_thread_context_restore.s + + + $PROJ_DIR$\..\src\tx_thread_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_identify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_initialize.c + + + $PROJ_DIR$\..\src\tx_thread_interrupt_control.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_disable.s + + + $PROJ_DIR$\..\src\tx_thread_interrupt_restore.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_end.s + + + $PROJ_DIR$\..\src\tx_thread_irq_nesting_start.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_resume.c + + + $PROJ_DIR$\..\src\tx_thread_schedule.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_shell_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_sleep.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_analyze.c + + + $PROJ_DIR$\..\src\tx_thread_stack_build.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_handler.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_stack_error_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_preempt_check.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_resume.c + + + $PROJ_DIR$\..\src\tx_thread_system_return.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_system_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_timeout.c + + + $PROJ_DIR$\..\src\tx_thread_vectored_context_save.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_time_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_expiration_process.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_initialize.c + + + $PROJ_DIR$\..\src\tx_timer_interrupt.s + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_performance_system_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_system_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_timer_thread_entry.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_buffer_full_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_disable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_enable.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_filter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_event_unfilter.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_initialize.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_interrupt_control.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_enter_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_isr_exit_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_register.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_object_unregister.c + + + $PROJ_DIR$\..\..\..\..\common\src\tx_trace_user_event_insert.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_block_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_allocate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_pool_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_byte_release.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_event_flags_set_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_mutex_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_flush.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_front_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_receive.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_queue_send_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_ceiling_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_prioritize.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_semaphore_put_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_entry_exit_notify.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_info_get.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_preemption_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_priority_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_relinquish.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_reset.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_resume.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_suspend.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_terminate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_time_slice_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_thread_wait_abort.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_activate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_change.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_create.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_deactivate.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_delete.c + + + $PROJ_DIR$\..\..\..\..\common\src\txe_timer_info_get.c + + + diff --git a/ports/cortex_r5/iar/example_build/tx_initialize_low_level.s b/ports/cortex_r5/iar/example_build/tx_initialize_low_level.s new file mode 100644 index 00000000..6e5da9e4 --- /dev/null +++ b/ports/cortex_r5/iar/example_build/tx_initialize_low_level.s @@ -0,0 +1,277 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Initialize */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_initialize.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +; + + EXTERN _tx_thread_system_stack_ptr + EXTERN _tx_initialize_unused_memory + EXTERN _tx_thread_context_save +; EXTERN _tx_thread_vectored_context_save + EXTERN _tx_thread_context_restore + +#ifdef TX_ENABLE_IRQ_NESTING + EXTERN _tx_thread_irq_nesting_start + EXTERN _tx_thread_irq_nesting_end +#endif + + EXTERN _tx_timer_interrupt + EXTERN ?cstartup + EXTERN _tx_build_options + EXTERN _tx_version_id +; +; +; +;/* Define the FREE_MEM segment that will specify where free memory is +; defined. This must also be located in at the end of other RAM segments +; in the linker control file. The value of this segment is what is passed +; to tx_application_define. */ +; + RSEG FREE_MEM:DATA + PUBLIC __tx_free_memory_start +__tx_free_memory_start + DS32 4 +; +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_initialize_low_level Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for any low-level processor */ +;/* initialization, including setting up interrupt vectors, setting */ +;/* up a periodic timer interrupt source, saving the system stack */ +;/* pointer for use in ISR processing later, and finding the first */ +;/* available RAM memory address for tx_application_define. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_initialize_low_level(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + ARM + PUBLIC _tx_initialize_low_level +_tx_initialize_low_level +; +; /****** NOTE ****** The IAR 4.11a and above releases call main in SYS mode. */ +; +; /* Remember the stack pointer, link register, and switch to SVC mode. */ +; + MOV r0, sp ; Remember the SP + MOV r1, lr ; Remember the LR + CPS #SVC_MODE ; Switch to SVC mode + MOV sp, r0 ; Inherit the stack pointer setup by cstartup + MOV lr, r1 ; Inherit the link register +; +; /* Pickup the start of free memory. */ +; + LDR r0, =__tx_free_memory_start ; Get end of non-initialized RAM area +; +; /* Save the system stack pointer. */ +; _tx_thread_system_stack_ptr = (VOID_PTR) (sp); +; +; /* Save the first available memory address. */ +; _tx_initialize_unused_memory = (VOID_PTR) FREE_MEM; +; + LDR r2, =_tx_initialize_unused_memory ; Pickup unused memory ptr address + STR r0, [r2, #0] ; Save first free memory address +; +; /* Setup Timer for periodic interrupts. */ +; +; /* Done, return to caller. */ +; + BX lr ; Return to caller +;} +; +;/* Define shells for each of the interrupt vectors. */ +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_undefined +__tx_undefined + B __tx_undefined ; Undefined handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_swi_interrupt +__tx_swi_interrupt + B __tx_swi_interrupt ; Software interrupt handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_prefetch_handler +__tx_prefetch_handler + B __tx_prefetch_handler ; Prefetch exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_abort_handler +__tx_abort_handler + B __tx_abort_handler ; Abort exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_reserved_handler +__tx_reserved_handler + B __tx_reserved_handler ; Reserved exception handler +; + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return + PUBLIC IRQ_Handler +__tx_irq_handler +IRQ_Handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_start +#endif +; +; /* For debug purpose, execute the timer interrupt processing here. In +; a real system, some kind of status indication would have to be checked +; before the timer interrupt handler could be called. */ +; + BL _tx_timer_interrupt ; Timer interrupt handler +; +; /* Application IRQ handlers can be called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +#ifdef TX_ENABLE_IRQ_NESTING + BL _tx_thread_irq_nesting_end +#endif +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore +; +; +; /* This is an example of a vectored IRQ handler. */ +; +; RSEG .text:CODE:NOROOT(2) +; PUBLIC __tx_example_vectored_irq_handler +;__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ +; STMDB sp!, {r0-r3} ; Save some scratch registers +; MRS r0, SPSR ; Pickup saved SPSR +; SUB lr, lr, #4 ; Adjust point of interrupt +; STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. In +; addition, IRQ interrupts may be re-enabled - with certain restrictions - +; if nested IRQ interrupts are desired. Interrupts may be re-enabled over +; small code sequences where lr is saved before enabling interrupts and +; restored after interrupts are again disabled. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_start +;#endif +; +; /* Application IRQ handler is called here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +;#ifdef TX_ENABLE_IRQ_NESTING +; BL _tx_thread_irq_nesting_end +;#endif +; +; /* Jump to context restore to restore system context. */ +; B _tx_thread_context_restore +; +; +; /* FIQ Handler */ + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_fiq_handler +__tx_fiq_handler + B __tx_fiq_handler ; FIQ interrupt handler +; +; +BUILD_OPTIONS + DC32 _tx_build_options ; Reference to ensure it comes in +VERSION_ID + DC32 _tx_version_id ; Reference to ensure it comes in + END + diff --git a/ports/cortex_r5/iar/inc/tx_port.h b/ports/cortex_r5/iar/inc/tx_port.h new file mode 100644 index 00000000..5c597d04 --- /dev/null +++ b/ports/cortex_r5/iar/inc/tx_port.h @@ -0,0 +1,384 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Cortex-R5/IAR */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX ARM port. */ + +#define TX_INT_DISABLE 0x80 /* Disable IRQ interrupts */ +#define TX_INT_ENABLE 0x00 /* Enable IRQ interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#ifdef TX_ENABLE_IRQ_NESTING +#define TX_IRQ_NESTING_ENABLED 1 +#else +#define TX_IRQ_NESTING_ENABLED 0 +#endif + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS (TX_IRQ_NESTING_ENABLED) + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 +#define TX_THREAD_EXTENSION_1 +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; \ + VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 ULONG tx_thread_vfp_enable; +#endif +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#if (__VER__ < 8000000) +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = _tx_iar_create_per_thread_tls_area(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {_tx_iar_destroy_per_thread_tls_area(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#endif +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +/* Determine if the ARM architecture has the CLZ instruction. This is available on + architectures v5 and above. If available, redefine the macro for calculating the + lowest bit set. */ + +#ifndef TX_DISABLE_INLINE + +#if __CORE__ > __ARM4TM__ + +#if __CPU_MODE__ == 2 + +#define TX_LOWEST_SET_BIT_CALCULATE(m, b) m = m & ((ULONG) (-((LONG) m))); \ + b = (UINT) __CLZ(m); \ + b = 31 - b; +#endif +#endif +#endif + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + + +/* First, check and see what mode the file is being compiled in. The IAR compiler + defines __CPU_MODE__ to 1, if the Thumb mode is present, and 2 if ARM 32-bit mode + is present. If ARM 32-bit mode is present, the fast CPSR manipulation macros + are available. Otherwise, if Thumb mode is present, we must use function calls. */ + +#ifdef TX_DISABLE_INLINE + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#else +#if __CPU_MODE__ == 2 + +#if (__VER__ < 8002000) +__intrinsic unsigned long __get_CPSR(); +__intrinsic void __set_CPSR( unsigned long ); +#endif + + +#if (__VER__ < 8002000) +#define TX_INTERRUPT_SAVE_AREA unsigned long interrupt_save; +#else +#define TX_INTERRUPT_SAVE_AREA unsigned int interrupt_save; +#endif + +#define TX_DISABLE interrupt_save = __get_CPSR(); \ + __set_CPSR(interrupt_save | TX_INT_DISABLE); +#define TX_RESTORE __set_CPSR(interrupt_save); + +#else + +UINT _tx_thread_interrupt_disable(void); +void _tx_thread_interrupt_restore(UINT old_posture); + + +#define TX_INTERRUPT_SAVE_AREA UINT interrupt_save; + +#define TX_DISABLE interrupt_save = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(interrupt_save); + +#endif +#endif + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define VFP extension for the Cortex-R5. Each is assumed to be called in the context of the executing + thread. */ + +void tx_thread_vfp_enable(void); +void tx_thread_vfp_disable(void); + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Cortex-R5/IAR Version 6.0 *"; +#else +#ifdef TX_MISRA_ENABLE +extern CHAR _tx_version_id[100]; +#else +extern CHAR _tx_version_id[]; +#endif +#endif + + +#endif + + + + + + + diff --git a/ports/cortex_r5/iar/readme_threadx.txt b/ports/cortex_r5/iar/readme_threadx.txt new file mode 100644 index 00000000..96f7a37f --- /dev/null +++ b/ports/cortex_r5/iar/readme_threadx.txt @@ -0,0 +1,426 @@ + Microsoft's Azure RTOS ThreadX for Cortex-R5 + + Thumb & 32-bit Mode + + Using the IAR Tools + +1. Building the ThreadX run-time Library + +Building the ThreadX library is easy. First, open the Azure RTOS workspace +azure_rtos.eww. Next, make the TX project the "active project" in the +IAR Embedded Workbench and select the "Make" button. You should observe +assembly and compilation of a series of ThreadX source files. This +results in the ThreadX run-time library file tx.a, which is needed by +the application. + + +2. Demonstration System + +The ThreadX demonstration is designed to execute under the IAR +Windows-based Cortex-R5 simulator. + +Building the demonstration is easy; simply make the sample_threadx.ewp project +the "active project" in the IAR Embedded Workbench and select the +"Make" button. + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file sample_threadx.out is a +binary file that can be downloaded and executed on IAR's Cortex-R5 simulator. + + +3. System Initialization + +The entry point in ThreadX for the Cortex-R5 using IAR tools is at label +?cstartup. This is defined within the IAR compiler's startup code. In +addition, this is where all static and global preset C variable +initialization processing takes place. + +The ThreadX tx_initialize_low_level.s file is responsible for setting up +various system data structures, and a periodic timer interrupt source. +By default, the vector area is defined at the top of cstartup.s, which is +a slightly modified from the base IAR file. + +The _tx_initialize_low_level function inside of tx_initialize_low_level.s +also determines the first available address for use by the application, which +is supplied as the sole input parameter to your application definition function, +tx_application_define. To accomplish this, a section is created in +tx_initialize_low_level.s called FREE_MEM, which must be located after all +other RAM sections in memory. + + +4. Register Usage and Stack Frames + +The IAR ARM compiler assumes that registers r0-r3 (a1-a4) and r12 (ip) are +scratch registers for each function. All other registers used by a C function +must be preserved by the function. ThreadX takes advantage of this in +situations where a context switch happens as a result of making a ThreadX +service call (which is itself a C function). In such cases, the saved +context of a thread is only the non-scratch registers. + +The following defines the saved context stack frames for context switches +that occur as a result of interrupt handling or from thread-level API calls. +All suspended threads have one of these two types of stack frames. The top +of the suspended thread's stack is pointed to by tx_thread_stack_ptr in the +associated thread control block TX_THREAD. + + + + Offset Interrupted Stack Frame Non-Interrupt Stack Frame + + 0x00 1 0 + 0x04 CPSR CPSR + 0x08 r0 (a1) r4 (v1) + 0x0C r1 (a2) r5 (v2) + 0x10 r2 (a3) r6 (v3) + 0x14 r3 (a4) r7 (v4) + 0x18 r4 (v1) r8 (v5) + 0x1C r5 (v2) r9 (v6) + 0x20 r6 (v3) r10 (v7) + 0x24 r7 (v4) r11 (fp) + 0x28 r8 (v5) r14 (lr) + 0x2C r9 (v6) + 0x30 r10 (v7) + 0x34 r11 (fp) + 0x38 r12 (ip) + 0x3C r14 (lr) + 0x40 PC + + +5. Conditional Compilation Switches + +The following are conditional compilation options for building the ThreadX library +and application: + + TX_ENABLE_IRQ_NESTING This assembler define enables IRQ + nested support. If IRQ nested + interrupt support is needed, this + define should be applied to + tx_initialize_low_level.s. + + TX_DISABLE_ERROR_CHECKING If defined before tx_api.h is included, + this define causes basic ThreadX error + checking to be disabled. Please see + Chapter 2 in the "ThreadX User Guide" + for more details. + + TX_MAX_PRIORITIES Defines the priority levels for ThreadX. + Legal values range from 32 through + 1024 (inclusive) and MUST be evenly divisible + by 32. Increasing the number of priority levels + supported increases the RAM usage by 128 bytes + for every group of 32 priorities. However, there + is only a negligible effect on performance. By + default, this value is set to 32 priority levels. + + TX_MINIMUM_STACK Defines the minimum stack size (in bytes). It is + used for error checking when threads are created. + The default value is port-specific and is found + in tx_port.h. + + TX_TIMER_THREAD_STACK_SIZE Defines the stack size (in bytes) of the internal + ThreadX timer thread. This thread processes all + thread sleep requests as well as all service call + timeouts. In addition, all application timer callback + routines are invoked from this context. The default + value is port-specific and is found in tx_port.h. + + TX_TIMER_THREAD_PRIORITY Defines the priority of the internal ThreadX timer + thread. The default value is priority 0 - the highest + priority in ThreadX. The default value is defined + in tx_port.h. + + TX_TIMER_PROCESS_IN_ISR Defined, this option eliminates the internal system + timer thread for ThreadX. This results in improved + performance on timer events and smaller RAM requirements + because the timer stack and control block are no + longer needed. However, using this option moves all + the timer expiration processing to the timer ISR level. + By default, this option is not defined. + + TX_REACTIVATE_INLINE Defined, this option performs reactivation of ThreadX + timers in-line instead of using a function call. This + improves performance but slightly increases code size. + By default, this option is not defined. + + TX_DISABLE_STACK_FILLING Defined, placing the 0xEF value in each byte of each + thread's stack is disabled. By default, this option is + not defined. + + TX_ENABLE_STACK_CHECKING Defined, this option enables ThreadX run-time stack checking, + which includes analysis of how much stack has been used and + examination of data pattern "fences" before and after the + stack area. If a stack error is detected, the registered + application stack error handler is called. This option does + result in slightly increased overhead and code size. Please + review the tx_thread_stack_error_notify API for more information. + By default, this option is not defined. + + TX_DISABLE_PREEMPTION_THRESHOLD Defined, this option disables the preemption-threshold feature + and slightly reduces code size and improves performance. Of course, + the preemption-threshold capabilities are no longer available. + By default, this option is not defined. + + TX_DISABLE_REDUNDANT_CLEARING Defined, this option removes the logic for initializing ThreadX + global C data structures to zero. This should only be used if + the compiler's initialization code sets all un-initialized + C global data to zero. Using this option slightly reduces + code size and improves performance during initialization. + By default, this option is not defined. + + TX_DISABLE_NOTIFY_CALLBACKS Defined, this option disables the notify callbacks for various + ThreadX objects. Using this option slightly reduces code size + and improves performance. + + TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on block pools. By default, this option is + not defined. + + TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on byte pools. By default, this option is + not defined. + + TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on event flags groups. By default, this option + is not defined. + + TX_MUTEX_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on mutexes. By default, this option is + not defined. + + TX_QUEUE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on queues. By default, this option is + not defined. + + TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on semaphores. By default, this option is + not defined. + + TX_THREAD_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on threads. By default, this option is + not defined. + + TX_TIMER_ENABLE_PERFORMANCE_INFO Defined, this option enables the gathering of performance + information on timers. By default, this option is + not defined. + + TX_ENABLE_EVENT_TRACE Defined, this option enables the internal ThreadX trace + feature. The trace buffer is supplied at a later time + via an application call to tx_trace_enable. + + TX_TRACE_TIME_SOURCE This defines the time-stamp source for event tracing. + This define is only pertinent if the ThreadX library is + built with TX_ENABLE_EVENT_TRACE defined. + + TX_TRACE_TIME_MASK This defines the number of valid bits in the event trace + time-stamp source defined previously. If the time-stamp + source is 16-bits, this value should be 0xFFFF. Alternatively, + if the time-stamp source is 32-bits, this value should be + 0xFFFFFFFF. This define is only pertinent if the ThreadX + library is built with TX_ENABLE_EVENT_TRACE defined. + + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the ThreadX library +project to enable various compiler optimizations. + +In addition, you can eliminate the ThreadX basic API error checking by +compiling your application code with the symbol TX_DISABLE_ERROR_CHECKING +defined. + + +7. Interrupt Handling + +ThreadX provides complete and high-performance interrupt handling for Cortex-R5 +targets. There are a certain set of requirements that are defined in the +following sub-sections: + + +7.1 Vector Area + +The Cortex-R5 vectors start at address zero. The demonstration system startup +cstartup.s file contains the vectors and is loaded at address zero. +On actual hardware platforms, this area might have to be copied to address 0. + + +7.2 IRQ ISRs + +ThreadX fully manages standard and vectored IRQ interrupts. ThreadX also supports nested +IRQ interrupts. The following sub-sections define the IRQ capabilities. + + +7.2.1 Standard IRQ ISRs + +The standard ARM IRQ mechanism has a single interrupt vector at address 0x18. This IRQ +interrupt is managed by the __tx_irq_handler code in tx_initialize_low_level. The following +is the default IRQ handler defined in tx_initialize_low_level.s: + + PUBLIC __tx_irq_handler + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.2 Vectored IRQ ISRs + +The vectored ARM IRQ mechanism has multiple interrupt vectors at addresses specified +by the particular implementation. The following is an example IRQ handler defined in +tx_initialize_low_level.s: + + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_example_vectored_irq_handler +__tx_example_vectored_irq_handler +; +; /* Jump to context save to save system context. */ + STMDB sp!, {r0-r3} ; Save some scratch registers + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers + BL _tx_thread_vectored_context_save +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Application ISR dispatch call goes here! */ +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.2.3 Nested IRQ Support + +By default, nested IRQ interrupt support is not enabled. To enable nested +IRQ support, the entire library should be built with TX_ENABLE_IRQ_NESTING +defined. With this defined, two new IRQ interrupt management services are +available, namely _tx_thread_irq_nesting_start and _tx_thread_irq_nesting_end. +These function should be called between the IRQ context save and restore +calls. + +Execution between the calls to _tx_thread_irq_nesting_start and +_tx_thread_irq_nesting_end is enabled for IRQ nesting. This is achieved +by switching from IRQ mode to SYS mode and enabling IRQ interrupts. +The SYS mode stack is used during the SYS mode operation, which was +setup in tx_initialize_low_level.s. When nested IRQ interrupts are no +longer required, calling the _tx_thread_irq_nesting_end service disables +nesting by disabling IRQ interrupts and switching back to IRQ mode in +preparation for the IRQ context restore service. + +The following is an example of enabling IRQ nested interrupts in a standard +IRQ handler: + + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_handler + RSEG .text:CODE:NOROOT(2) + PUBLIC __tx_irq_processing_return +__tx_irq_handler +; +; /* Jump to context save to save system context. */ + B _tx_thread_context_save +__tx_irq_processing_return +; +; /* At this point execution is still in the IRQ mode. The CPSR, point of +; interrupt, and all C scratch registers are available for use. Note +; that IRQ interrupts are still disabled upon return from the context +; save function. */ +; +; /* Interrupt nesting is allowed after calling _tx_thread_irq_nesting_start +; from IRQ mode with interrupts disabled. This routine switches to the +; system mode and returns with IRQ interrupts enabled. +; +; NOTE: It is very important to ensure all IRQ interrupts are cleared +; prior to enabling nested IRQ interrupts. */ +; + BL _tx_thread_irq_nesting_start + +; /* Application ISR dispatch call goes here! */ +; +; /* If interrupt nesting was started earlier, the end of interrupt nesting +; service must be called before returning to _tx_thread_context_restore. +; This routine returns in processing in IRQ mode with interrupts disabled. */ +; + BL _tx_thread_irq_nesting_end +; +; /* Jump to context restore to restore system context. */ + B _tx_thread_context_restore + + +7.3 FIQ Interrupts + +By default, Cortex-R5 FIQ interrupts are left alone by ThreadX. Of course, this +means that the application is fully responsible for enabling the FIQ interrupt +and saving/restoring any registers used in the FIQ ISR processing. To globally +enable FIQ interrupts, the application should enable FIQ interrupts at the +beginning of a thread or before any threads are created in tx_application_define. +In addition, the application must ensure that no ThreadX service calls are made +from default FIQ ISRs, which is located in tx_initialize_low_level.s. + + +7.3.1 Managed FIQ Interrupts + +ThreadX management of FIQ interrupts is not provided because FIQ interrupts +cannot be disabled. The hardware does not support nested FIQ interrupts. + + +8. ThreadX Timer Interrupt + +ThreadX requires a periodic interrupt source to manage all time-slicing, +thread sleeps, timeouts, and application timers. Without such a timer +interrupt source, these services are not functional. However, all other +ThreadX services are operational without a periodic timer source. + +To add the timer interrupt processing, simply make a call to _tx_timer_interrupt +in the IRQ processing. + + +9. Thumb/Cortex-R5 Mixed Mode + +By default, ThreadX is setup for running in Cortex-R5 32-bit mode. This is +also true for the demonstration system. It is possible to build any +ThreadX file and/or the application in Thumb mode. The only exception +to this is the file tx_thread_shell_entry.c. This file must always be +built in 32-bit mode. + + +10. IAR Thread-safe Library Support + +Thread-safe support for the IAR tools is easily enabled by building the ThreadX library +and the application with TX_ENABLE_IAR_LIBRARY_SUPPORT. Also, the linker control file +should have the following line added (if not already in place): + +initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application + + +11. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version for Cortex-R5 using IAR's ARM tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/cortex_r5/iar/src/tx_iar.c b/ports/cortex_r5/iar/src/tx_iar.c new file mode 100644 index 00000000..11fcefb3 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_iar.c @@ -0,0 +1,804 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** IAR Multithreaded Library Support */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Define IAR library for tools prior to version 8. */ + +#if (__VER__ < 8000000) + + +/* IAR version 7 and below. */ + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) __iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION __iar_dlib_perthread_access(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +#if _MULTI_THREAD + +TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define the TLS access function for the IAR library. */ + +void _DLIB_TLS_MEMORY *__iar_dlib_perthread_access(void _DLIB_TLS_MEMORY *symbp) +{ + +char _DLIB_TLS_MEMORY *p = 0; + + /* Is there a current thread? */ + if (_tx_thread_current_ptr) + p = (char _DLIB_TLS_MEMORY *) _tx_thread_current_ptr -> tx_thread_iar_tls_pointer; + else + p = (void _DLIB_TLS_MEMORY *) __segment_begin("__DLIB_PERTHREAD"); + p += __IAR_DLIB_PERTHREAD_SYMBOL_OFFSET(symbp); + return (void _DLIB_TLS_MEMORY *) p; +} + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* _MULTI_THREAD */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#else /* IAR version 8 and above. */ + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_initialize.h" +#include "tx_thread.h" +#include "tx_mutex.h" + +/* This implementation requires that the following macros are defined in the + tx_port.h file and is included with the following code segments: + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#include +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +#define TX_THREAD_EXTENSION_2 VOID *tx_thread_iar_tls_pointer; +#else +#define TX_THREAD_EXTENSION_2 +#endif + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT +void *_tx_iar_create_per_thread_tls_area(void); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); +void __iar_Initlocks(void); + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) thread_ptr -> tx_thread_iar_tls_pointer = __iar_dlib_perthread_allocate(); +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) do {__iar_dlib_perthread_deallocate(thread_ptr -> tx_thread_iar_tls_pointer); \ + thread_ptr -> tx_thread_iar_tls_pointer = TX_NULL; } while(0); +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION do {__iar_Initlocks();} while(0); +#else +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#endif + + This should be done automatically if TX_ENABLE_IAR_LIBRARY_SUPPORT is defined while building the ThreadX library and the + application. + + Finally, the project options General Options -> Library Configuration should have the "Enable thread support in library" box selected. +*/ + +#ifdef TX_ENABLE_IAR_LIBRARY_SUPPORT + +#include + + +void * __aeabi_read_tp(); + +void* _tx_iar_create_per_thread_tls_area(); +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr); + +#pragma section="__iar_tls$$DATA" + +/* Define the TLS access function for the IAR library. */ +void * __aeabi_read_tp(void) +{ + void *p = 0; + TX_THREAD *thread_ptr = _tx_thread_current_ptr; + if (thread_ptr) + { + p = thread_ptr->tx_thread_iar_tls_pointer; + } + else + { + p = __section_begin("__iar_tls$$DATA"); + } + return p; +} + +/* Define the TLS creation and destruction to use malloc/free. */ + +void* _tx_iar_create_per_thread_tls_area() +{ + UINT tls_size = __iar_tls_size(); + + /* Get memory for TLS. */ + void *p = malloc(tls_size); + + /* Initialize TLS-area and run constructors for objects in TLS */ + __iar_tls_init(p); + return p; +} + +void _tx_iar_destroy_per_thread_tls_area(void *tls_ptr) +{ + /* Destroy objects living in TLS */ + __call_thread_dtors(); + free(tls_ptr); +} + +#ifndef _MAX_LOCK +#define _MAX_LOCK 4 +#endif + +static TX_MUTEX __tx_iar_system_lock_mutexes[_MAX_LOCK]; +static UINT __tx_iar_system_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_system_lock_no_mutexes; +UINT __tx_iar_system_lock_internal_errors; +UINT __tx_iar_system_lock_isr_caller; + + +/* Define mutexes for IAR library. */ + +void __iar_system_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_LOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_system_lock_mutexes[__tx_iar_system_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_system_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_system_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_system_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR System Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_system_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_system_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_system_Mtxlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + +void __iar_system_Mtxunlock(__iar_Rmtx *m) +{ + if (*m) + { + UINT status; + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_system_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_system_lock_isr_caller++; + } + } +} + + +#if _DLIB_FILE_DESCRIPTOR + +#include /* Added to get access to FOPEN_MAX */ +#ifndef _MAX_FLOCK +#define _MAX_FLOCK FOPEN_MAX /* Define _MAX_FLOCK as the maximum number of open files */ +#endif + + +TX_MUTEX __tx_iar_file_lock_mutexes[_MAX_FLOCK]; +UINT __tx_iar_file_lock_next_free_mutex = 0; + + +/* Define error counters, just for debug purposes. */ + +UINT __tx_iar_file_lock_no_mutexes; +UINT __tx_iar_file_lock_internal_errors; +UINT __tx_iar_file_lock_isr_caller; + + +void __iar_file_Mtxinit(__iar_Rmtx *m) +{ + +UINT i; +UINT status; +TX_MUTEX *mutex_ptr; + + + /* First, find a free mutex in the list. */ + for (i = 0; i < _MAX_FLOCK; i++) + { + + /* Setup a pointer to the start of the next free mutex. */ + mutex_ptr = &__tx_iar_file_lock_mutexes[__tx_iar_file_lock_next_free_mutex++]; + + /* Check for wrap-around on the next free mutex. */ + if (__tx_iar_file_lock_next_free_mutex >= _MAX_LOCK) + { + + /* Yes, set the free index back to 0. */ + __tx_iar_file_lock_next_free_mutex = 0; + } + + /* Is this mutex free? */ + if (mutex_ptr -> tx_mutex_id != TX_MUTEX_ID) + { + + /* Yes, this mutex is free, get out of the loop! */ + break; + } + } + + /* Determine if a free mutex was found. */ + if (i >= _MAX_LOCK) + { + + /* Error! No more free mutexes! */ + + /* Increment the no mutexes error counter. */ + __tx_iar_file_lock_no_mutexes++; + + /* Set return pointer to NULL. */ + *m = TX_NULL; + + /* Return. */ + return; + } + + /* Now create the ThreadX mutex for the IAR library. */ + status = _tx_mutex_create(mutex_ptr, "IAR File Library Lock", TX_NO_INHERIT); + + /* Determine if the creation was successful. */ + if (status == TX_SUCCESS) + { + + /* Yes, successful creation, return mutex pointer. */ + *m = (VOID *) mutex_ptr; + } + else + { + + /* Increment the internal error counter. */ + __tx_iar_file_lock_internal_errors++; + + /* Return a NULL pointer to indicate an error. */ + *m = TX_NULL; + } +} + +void __iar_file_Mtxdst(__iar_Rmtx *m) +{ + + /* Simply delete the mutex. */ + _tx_mutex_delete((TX_MUTEX *) *m); +} + +void __iar_file_Mtxlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex locks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Get the mutex. */ + status = _tx_mutex_get((TX_MUTEX *) *m, TX_WAIT_FOREVER); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} + +void __iar_file_Mtxunlock(__iar_Rmtx *m) +{ + +UINT status; + + + /* Determine the caller's context. Mutex unlocks are only available from initialization and + threads. */ + if ((_tx_thread_system_state == 0) || (_tx_thread_system_state >= TX_INITIALIZE_IN_PROGRESS)) + { + + /* Release the mutex. */ + status = _tx_mutex_put((TX_MUTEX *) *m); + + /* Check the status of the mutex release. */ + if (status) + { + + /* Internal error, increment the counter. */ + __tx_iar_file_lock_internal_errors++; + } + } + else + { + + /* Increment the ISR caller error. */ + __tx_iar_file_lock_isr_caller++; + } +} +#endif /* _DLIB_FILE_DESCRIPTOR */ + +#endif /* TX_ENABLE_IAR_LIBRARY_SUPPORT */ + +#endif /* IAR version 8 and above. */ diff --git a/ports/cortex_r5/iar/src/tx_thread_context_restore.s b/ports/cortex_r5/iar/src/tx_thread_context_restore.s new file mode 100644 index 00000000..3d28fdb5 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_context_restore.s @@ -0,0 +1,247 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + +SVC_MODE DEFINE 0x13 ; SVC mode +IRQ_MODE DEFINE 0x12 ; IRQ mode +DISABLE_INTS DEFINE 0x80 ; Disable IRQ interrupts +THUMB_MASK DEFINE 0x20 ; Thumb bit mask + +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_thread_execute_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_thread_preempt_disable + EXTERN _tx_execution_isr_exit +; +; + +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_restore Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function restores the interrupt context if it is processing a */ +;/* nested interrupt. If not, it returns to the interrupt thread if no */ +;/* preemption is necessary. Otherwise, if preemption is necessary or */ +;/* if no thread was running, the function returns to the scheduler. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling routine */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs Interrupt Service Routines */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_restore(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_restore + ARM +_tx_thread_context_restore +; +; /* Lockout interrupts. */ +; + CPSID i ; Disable IRQ interrupts + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR exit function to indicate an ISR is complete. */ +; + BL _tx_execution_isr_exit ; Call the ISR exit function +#endif +; +; /* Determine if interrupts are nested. */ +; if (--_tx_thread_system_state) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3] ; Pickup system state + SUB r2, r2, #1 ; Decrement the counter + STR r2, [r3] ; Store the counter + CMP r2, #0 ; Was this the first interrupt? + BEQ __tx_thread_not_nested_restore ; If so, not a nested restore +; +; /* Interrupts are nested. */ +; +; /* Just recover the saved registers and return to the point of +; interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +__tx_thread_not_nested_restore +; +; /* Determine if a thread was interrupted and no preemption is required. */ +; else if (((_tx_thread_current_ptr) && (_tx_thread_current_ptr == _tx_thread_execute_ptr) +; || (_tx_thread_preempt_disable)) +; { +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1] ; Pickup actual current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_restore ; Yes, idle system was interrupted +; + LDR r3, =_tx_thread_preempt_disable ; Pickup preempt disable address + LDR r2, [r3] ; Pickup actual preempt disable flag + CMP r2, #0 ; Is it set? + BNE __tx_thread_no_preempt_restore ; Yes, don't preempt this thread + LDR r3, =_tx_thread_execute_ptr ; Pickup address of execute thread ptr + LDR r2, [r3] ; Pickup actual execute thread pointer + CMP r0, r2 ; Is the same thread highest priority? + BNE __tx_thread_preempt_restore ; No, preemption needs to happen +; +; +__tx_thread_no_preempt_restore +; +; /* Restore interrupted thread or ISR. */ +; +; /* Pickup the saved stack pointer. */ +; tmp_ptr = _tx_thread_current_ptr -> tx_thread_stack_ptr; +; +; /* Recover the saved context and return to the point of interrupt. */ +; + LDMIA sp!, {r0, r10, r12, lr} ; Recover SPSR, POI, and scratch regs + MSR SPSR_cxsf, r0 ; Put SPSR back + LDMIA sp!, {r0-r3} ; Recover r0-r3 + MOVS pc, lr ; Return to point of interrupt +; +; } +; else +; { +__tx_thread_preempt_restore +; + LDMIA sp!, {r3, r10, r12, lr} ; Recover temporarily saved registers + MOV r1, lr ; Save lr (point of interrupt) + CPS #SVC_MODE ; Enter SVC mode + STR r1, [sp, #-4]! ; Save point of interrupt + STMDB sp!, {r4-r12, lr} ; Save upper half of registers + MOV r4, r3 ; Save SPSR in r4 + CPS #IRQ_MODE ; Enter IRQ mode + LDMIA sp!, {r0-r3} ; Recover r0-r3 + CPS #SVC_MODE ; Enter SVC mode + STMDB sp!, {r0-r3} ; Save r0-r3 on thread's stack + + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r2, [r0, #144] ; Pickup the VFP enabled flag + CMP r2, #0 ; Is the VFP enabled? + BEQ _tx_skip_irq_vfp_save ; No, skip VFP IRQ save + VMRS r2, FPSCR ; Pickup the FPSCR + STR r2, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D0-D15} ; Save D0-D15 +_tx_skip_irq_vfp_save +#endif + + MOV r3, #1 ; Build interrupt stack type + STMDB sp!, {r3, r4} ; Save interrupt stack type and SPSR + STR sp, [r0, #8] ; Save stack pointer in thread control + ; block + BIC r4, r4, #THUMB_MASK ; Clear the Thumb bit of CPSR + ORR r3, r4, #DISABLE_INTS ; Or-in interrupt lockout bit(s) + MSR CPSR_cxsf, r3 ; Lockout interrupts +; +; /* Save the remaining time-slice and disable it. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup time-slice variable address + LDR r2, [r3] ; Pickup time-slice + CMP r2, #0 ; Is it active? + BEQ __tx_thread_dont_save_ts ; No, don't save it +; +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r2, [r0, #24] ; Save thread's time-slice + MOV r2, #0 ; Clear value + STR r2, [r3] ; Disable global time-slice flag +; +; } +__tx_thread_dont_save_ts +; +; +; /* Clear the current task pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + MOV r0, #0 ; NULL value + STR r0, [r1] ; Clear current thread pointer +; +; /* Return to the scheduler. */ +; _tx_thread_schedule(); +; + B _tx_thread_schedule ; Return to scheduler +; } +; +__tx_thread_idle_system_restore +; +; /* Just return back to the scheduler! */ +; + CPS #SVC_MODE ; Enter SVC mode + + B _tx_thread_schedule ; Return to scheduler +;} +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_context_save.s b/ports/cortex_r5/iar/src/tx_thread_context_save.s new file mode 100644 index 00000000..97b1d3cf --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_context_save.s @@ -0,0 +1,198 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN __tx_irq_processing_return + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_context_save Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_context_save + ARM +_tx_thread_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, and all registers are intact. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + STMDB sp!, {r0-r3} ; Save some working registers + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Save the rest of the scratch registers on the stack and return to the +; calling ISR. */ +; + MRS r0, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r0, r10, r12, lr} ; Store other registers +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Save minimal context of interrupted thread. */ +; + MRS r2, SPSR ; Pickup saved SPSR + SUB lr, lr, #4 ; Adjust point of interrupt + STMDB sp!, {r2, r10, r12, lr} ; Store other registers +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #16 ; Recover saved registers + B __tx_irq_processing_return ; Continue IRQ processing +; +; } +;} +; + +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_interrupt_control.s b/ports/cortex_r5/iar/src/tx_thread_interrupt_control.s new file mode 100644 index 00000000..ad3a6bae --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_interrupt_control.s @@ -0,0 +1,97 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; + +INT_MASK DEFINE 0x80 ; Interrupt bit mask +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_control Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for changing the interrupt lockout */ +;/* posture of the system. */ +;/* */ +;/* INPUT */ +;/* */ +;/* new_posture New interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_control(UINT new_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_control + ARM +_tx_thread_interrupt_control +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r3, CPSR ; Pickup current CPSR + BIC r1, r3, #INT_MASK ; Clear interrupt lockout bits + ORR r1, r1, r0 ; Or-in new interrupt lockout bits +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r1 ; Setup new CPSR + AND r0, r3, #INT_MASK ; Return previous interrupt mask + + BX lr ; Return to caller +; +;} +; +; + END diff --git a/ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s b/ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s new file mode 100644 index 00000000..b795d14f --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_interrupt_disable.s @@ -0,0 +1,89 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +DISABLE_INTS DEFINE 0x80 ; IRQ interrupts disabled +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_disable Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for disabling interrupts */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;UINT _tx_thread_interrupt_disable(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_disable + ARM +_tx_thread_interrupt_disable??rA +_tx_thread_interrupt_disable +; +; /* Pickup current interrupt lockout posture. */ +; + MRS r0, CPSR ; Pickup current CPSR + CPSID i ; Mask interrupts + BX lr ; Return to caller +;} +; +; + END diff --git a/ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s b/ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s new file mode 100644 index 00000000..9fc7b4e4 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_interrupt_restore.s @@ -0,0 +1,84 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_interrupt_restore Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is responsible for restoring interrupts to the state */ +;/* returned by a previous _tx_thread_interrupt_disable call. */ +;/* */ +;/* INPUT */ +;/* */ +;/* old_posture Old interrupt lockout posture */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* Application Code */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;void _tx_thread_interrupt_restore(UINT old_posture) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_interrupt_restore + ARM +_tx_thread_interrupt_restore +; +; /* Apply the new interrupt posture. */ +; + MSR CPSR_cxsf, r0 ; Setup new CPSR + + BX lr ; Return to caller +;} +; + END diff --git a/ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s new file mode 100644 index 00000000..e9bb5eee --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_end.s @@ -0,0 +1,99 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +IRQ_MODE DEFINE 0x12 ; IRQ mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_end Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_irq_nesting_start has been called and switches the IRQ */ +;/* processing from system mode back to IRQ mode prior to the ISR */ +;/* calling _tx_thread_context_restore. Note that this function */ +;/* assumes the system stack pointer is in the same position after */ +;/* nesting start function was called. */ +;/* */ +;/* This function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts disabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_end(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_end + ARM +_tx_thread_irq_nesting_end + MOV r3, lr ; Save ISR return address + CPSID i ; Disable interrupts + POP {lr} ; Pickup saved lr + CPS #IRQ_MODE ; Switch to IRQ mode + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s new file mode 100644 index 00000000..70e6116b --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_irq_nesting_start.s @@ -0,0 +1,96 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +SYS_MODE DEFINE 0x1F ; System mode +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_irq_nesting_start Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is called by the application from IRQ mode after */ +;/* _tx_thread_context_save has been called and switches the IRQ */ +;/* processing to the system mode so nested IRQ interrupt processing */ +;/* is possible (system mode has its own "lr" register). Note that */ +;/* this function assumes that the system mode stack pointer was setup */ +;/* during low-level initialization (tx_initialize_low_level.s). */ +;/* */ +;/* This function returns with IRQ interrupts enabled. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_irq_nesting_start(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_irq_nesting_start + ARM +_tx_thread_irq_nesting_start + MOV r3, lr ; Save ISR return address + CPS #SYS_MODE ; Enter SYS mode + PUSH {lr} ; Save system mode lr on the system mode stack + CPSIE i ; Enable interrupts + MOV pc, r3 ; Return to ISR +;} +; +; + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_schedule.s b/ports/cortex_r5/iar/src/tx_thread_schedule.s new file mode 100644 index 00000000..14403ee3 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_schedule.s @@ -0,0 +1,220 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_execute_ptr + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_execution_thread_enter +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_schedule Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function waits for a thread control block pointer to appear in */ +;/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +;/* in the variable, the corresponding thread is resumed. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_initialize_kernel_enter ThreadX entry function */ +;/* _tx_thread_system_return Return to system from thread */ +;/* _tx_thread_context_restore Restore thread's context */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_schedule(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_schedule + ARM +_tx_thread_schedule??rA +_tx_thread_schedule +; +; /* Enable interrupts. */ +; + CPSIE i ; Enable IRQ interrupts + +; +; /* Wait for a thread to execute. */ +; do +; { + LDR r1, =_tx_thread_execute_ptr ; Address of thread execute ptr +; +__tx_thread_schedule_loop +; + LDR r0, [r1, #0] ; Pickup next thread to execute + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_schedule_loop ; If so, keep looking for a thread +; +; } +; while(_tx_thread_execute_ptr == TX_NULL); +; +; /* Yes! We have a thread to execute. Lockout interrupts and +; transfer control to it. */ +; + CPSID i ; Disable interrupts +; +; /* Setup the current thread pointer. */ +; _tx_thread_current_ptr = _tx_thread_execute_ptr; +; + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread + STR r0, [r1, #0] ; Setup current thread pointer +; +; /* Increment the run count for this thread. */ +; _tx_thread_current_ptr -> tx_thread_run_count++; +; + LDR r2, [r0, #4] ; Pickup run counter + LDR r3, [r0, #24] ; Pickup time-slice for this thread + ADD r2, r2, #1 ; Increment thread run-counter + STR r2, [r0, #4] ; Store the new run counter +; +; /* Setup time-slice, if present. */ +; _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; +; + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + ; variable + LDR sp, [r0, #8] ; Switch stack pointers + STR r3, [r2, #0] ; Setup time-slice +; +; /* Switch to the thread's stack. */ +; sp = _tx_thread_execute_ptr -> tx_thread_stack_ptr; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread entry function to indicate the thread is executing. */ +; + MOV r5, r0 ; Save r0 + BL _tx_execution_thread_enter ; Call the thread execution enter function + MOV r0, r5 ; Restore r0 +#endif +; +; /* Determine if an interrupt frame or a synchronous task suspension frame +; is present. */ +; + LDMIA sp!, {r4, r5} ; Pickup the stack type and saved CPSR + CMP r4, #0 ; Check for synchronous context switch + BEQ _tx_solicited_return + MSR SPSR_cxsf, r5 ; Setup SPSR for return +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_interrupt_vfp_restore ; No, skip VFP interrupt restore + VLDMIA sp!, {D0-D15} ; Recover D0-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_interrupt_vfp_restore: +#endif + LDMIA sp!, {r0-r12, lr, pc}^ ; Return to point of thread interrupt + +_tx_solicited_return: +#ifdef __ARMVFP__ + LDR r1, [r0, #144] ; Pickup the VFP enabled flag + CMP r1, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_restore ; No, skip VFP solicited restore + VLDMIA sp!, {D8-D15} ; Recover D8-D15 + LDR r4, [sp], #4 ; Pickup FPSCR + VMSR FPSCR, r4 ; Restore FPSCR +_tx_skip_solicited_vfp_restore: +#endif + MOV r0, r5 ; Move CPSR to scratch register + LDMIA sp!, {r4-r11, lr} ; Return to thread synchronously + MSR CPSR_cxsf, r0 ; Recover CPSR + + BX lr ; Return to caller +; +;} +; + +#ifdef __ARMVFP__ + PUBLIC tx_thread_vfp_enable + CODE32 +tx_thread_vfp_enable??rA +tx_thread_vfp_enable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_enable ; If NULL, skip VFP enable + MOV r0, #1 ; Build enable value + STR r0, [r1, #144] ; Set the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_enable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller + + PUBLIC tx_thread_vfp_disable + CODE32 +tx_thread_vfp_disable??rA +tx_thread_vfp_disable + MRS r2, CPSR ; Pickup the CPSR + CPSID i ; Disable IRQ interrupts + LDR r0, =_tx_thread_current_ptr ; Build current thread pointer address + LDR r1, [r0] ; Pickup current thread pointer + CMP r1, #0 ; Check for NULL thread pointer + BEQ __tx_no_thread_to_disable ; If NULL, skip VFP disable + MOV r0, #0 ; Build disable value + STR r0, [r1, #144] ; Clear the VFP enable flag (tx_thread_vfp_enable field in TX_THREAD) +__tx_no_thread_to_disable: + MSR CPSR_cxsf, r2 ; Recover CPSR + BX LR ; Return to caller +#endif + + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_stack_build.s b/ports/cortex_r5/iar/src/tx_thread_stack_build.s new file mode 100644 index 00000000..b09b4f98 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_stack_build.s @@ -0,0 +1,151 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +; +; +SVC_MODE DEFINE 0x13 ; SVC mode +CPSR_MASK DEFINE 0x9F ; Mask initial CPSR, IRQ ints enabled +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_stack_build Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function builds a stack frame on the supplied thread's stack. */ +;/* The stack frame results in a fake interrupt return to the supplied */ +;/* function pointer. */ +;/* */ +;/* INPUT */ +;/* */ +;/* thread_ptr Pointer to thread control blk */ +;/* function_ptr Pointer to return function */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* _tx_thread_create Create thread service */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_stack_build + + ARM +_tx_thread_stack_build +; +; +; /* Build a fake interrupt frame. The form of the fake interrupt stack +; on the Cortex-R5 should look like the following after it is built: +; +; Stack Top: 1 Interrupt stack frame type +; CPSR Initial value for CPSR +; a1 (r0) Initial value for a1 +; a2 (r1) Initial value for a2 +; a3 (r2) Initial value for a3 +; a4 (r3) Initial value for a4 +; v1 (r4) Initial value for v1 +; v2 (r5) Initial value for v2 +; v3 (r6) Initial value for v3 +; v4 (r7) Initial value for v4 +; v5 (r8) Initial value for v5 +; sb (r9) Initial value for sb +; sl (r10) Initial value for sl +; fp (r11) Initial value for fp +; ip (r12) Initial value for ip +; lr (r14) Initial value for lr +; pc (r15) Initial value for pc +; 0 For stack backtracing +; +; Stack Bottom: (higher memory address) */ +; + LDR r2, [r0, #16] ; Pickup end of stack area + BIC r2, r2, #7 ; Ensure 8-byte alignment + SUB r2, r2, #76 ; Allocate space for the stack frame +; +; /* Actually build the stack frame. */ +; + MOV r3, #1 ; Build interrupt stack type + STR r3, [r2, #0] ; Store stack type + MOV r3, #0 ; Build initial register value + STR r3, [r2, #8] ; Store initial r0 + STR r3, [r2, #12] ; Store initial r1 + STR r3, [r2, #16] ; Store initial r2 + STR r3, [r2, #20] ; Store initial r3 + STR r3, [r2, #24] ; Store initial r4 + STR r3, [r2, #28] ; Store initial r5 + STR r3, [r2, #32] ; Store initial r6 + STR r3, [r2, #36] ; Store initial r7 + STR r3, [r2, #40] ; Store initial r8 + STR r3, [r2, #44] ; Store initial r9 + LDR r3, [r0, #12] ; Pickup stack starting address + STR r3, [r2, #48] ; Store initial r10 (sl) + MOV r3, #0 ; Build initial register value + STR r3, [r2, #52] ; Store initial r11 + STR r3, [r2, #56] ; Store initial r12 + STR r3, [r2, #60] ; Store initial lr + STR r1, [r2, #64] ; Store initial pc + STR r3, [r2, #68] ; 0 for back-trace + MRS r1, CPSR ; Pickup CPSR + BIC r1, r1, #CPSR_MASK ; Mask mode bits of CPSR + ORR r3, r1, #SVC_MODE ; Build CPSR, SVC mode, interrupts enabled + STR r3, [r2, #4] ; Store initial CPSR +; +; /* Setup stack pointer. */ +; thread_ptr -> tx_thread_stack_ptr = r2; +; + STR r2, [r0, #8] ; Save stack pointer in thread's + ; control block + + BX lr ; Return to caller +;} + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_system_return.s b/ports/cortex_r5/iar/src/tx_thread_system_return.s new file mode 100644 index 00000000..fbd5b756 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_system_return.s @@ -0,0 +1,155 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; +; + EXTERN _tx_thread_current_ptr + EXTERN _tx_timer_time_slice + EXTERN _tx_thread_schedule + EXTERN _tx_execution_thread_exit +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_system_return Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function is target processor specific. It is used to transfer */ +;/* control from a thread back to the ThreadX system. Only a */ +;/* minimal context is saved since the compiler assumes temp registers */ +;/* are going to get slicked by a function call anyway. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_thread_schedule Thread scheduling loop */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ThreadX components */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_system_return(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_system_return + ARM +_tx_thread_system_return??rA +_tx_thread_system_return +; +; /* Lockout interrupts. */ +; + MRS r1, CPSR ; Pickup the CPSR + CPSID i ; Disable interrupts +; /* Save minimal context on the stack. */ +; + STMDB sp!, {r4-r11, lr} ; Save minimal context + LDR r5, =_tx_thread_current_ptr ; Pickup address of current ptr + LDR r6, [r5, #0] ; Pickup current thread pointer + +#ifdef __ARMVFP__ + LDR r0, [r6, #144] ; Pickup the VFP enabled flag + CMP r0, #0 ; Is the VFP enabled? + BEQ _tx_skip_solicited_vfp_save ; No, skip VFP solicited save + VMRS r4, FPSCR ; Pickup the FPSCR + STR r4, [sp, #-4]! ; Save FPSCR + VSTMDB sp!, {D8-D15} ; Save D8-D15 +_tx_skip_solicited_vfp_save: +#endif + + MOV r0, #0 ; Build a solicited stack type + STMDB sp!, {r0-r1} ; Save type and CPSR +; +; +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the thread exit function to indicate the thread is no longer executing. */ +; + BL _tx_execution_thread_exit ; Call the thread exit function +#endif + + LDR r2, =_tx_timer_time_slice ; Pickup address of time slice + LDR r1, [r2, #0] ; Pickup current time slice +; +; /* Save current stack and switch to system stack. */ +; _tx_thread_current_ptr -> tx_thread_stack_ptr = sp; +; sp = _tx_thread_system_stack_ptr; +; + STR sp, [r6, #8] ; Save thread stack pointer +; +; /* Determine if the time-slice is active. */ +; if (_tx_timer_time_slice) +; { +; + MOV r4, #0 ; Build clear value + CMP r1, #0 ; Is a time-slice active? + BEQ __tx_thread_dont_save_ts ; No, don't save the time-slice +; +; /* Save time-slice for the thread and clear the current time-slice. */ +; _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; +; _tx_timer_time_slice = 0; +; + STR r4, [r2, #0] ; Clear time-slice + STR r1, [r6, #24] ; Save current time-slice +; +; } +__tx_thread_dont_save_ts +; +; /* Clear the current thread pointer. */ +; _tx_thread_current_ptr = TX_NULL; +; + STR r4, [r5, #0] ; Clear current thread pointer + B _tx_thread_schedule ; Jump to scheduler! +; +;} + END + diff --git a/ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s b/ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s new file mode 100644 index 00000000..ebc54f54 --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_thread_vectored_context_save.s @@ -0,0 +1,184 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Thread */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_thread.h" +;#include "tx_timer.h" +; +; + EXTERN _tx_thread_system_state + EXTERN _tx_thread_current_ptr + EXTERN _tx_execution_isr_enter +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_thread_vectored_context_save Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function saves the context of an executing thread in the */ +;/* beginning of interrupt processing. The function also ensures that */ +;/* the system stack is used upon return to the calling ISR. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* None */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* ISRs */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_thread_vectored_context_save(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_thread_vectored_context_save + ARM +_tx_thread_vectored_context_save +; +; /* Upon entry to this routine, it is assumed that IRQ interrupts are locked +; out, we are in IRQ mode, the minimal context is already saved, and the +; lr register contains the return ISR address. */ +; +; /* Check for a nested interrupt condition. */ +; if (_tx_thread_system_state++) +; { +; + LDR r3, =_tx_thread_system_state ; Pickup address of system state var + LDR r2, [r3, #0] ; Pickup system state + CMP r2, #0 ; Is this the first interrupt? + BEQ __tx_thread_not_nested_save ; Yes, not a nested context save +; +; /* Nested interrupt condition. */ +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Return to the ISR. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +__tx_thread_not_nested_save +; } +; +; /* Otherwise, not nested, check to see if a thread was running. */ +; else if (_tx_thread_current_ptr) +; { +; + ADD r2, r2, #1 ; Increment the interrupt counter + STR r2, [r3, #0] ; Store it back in the variable + LDR r1, =_tx_thread_current_ptr ; Pickup address of current thread ptr + LDR r0, [r1, #0] ; Pickup current thread pointer + CMP r0, #0 ; Is it NULL? + BEQ __tx_thread_idle_system_save ; If so, interrupt occured in + ; scheduling loop - nothing needs saving! +; +; /* Note: Minimal context of interrupted thread is already saved. */ +; +; /* Save the current stack pointer in the thread's control block. */ +; _tx_thread_current_ptr -> tx_stack_ptr = sp; +; +; /* Switch to the system stack. */ +; sp = _tx_thread_system_stack_ptr; +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + BX lr ; Return to caller +; +; } +; else +; { +; +__tx_thread_idle_system_save +; +; /* Interrupt occurred in the scheduling loop. */ +; +; /* Not much to do here, just adjust the stack pointer, and return to IRQ +; processing. */ +; + MOV r10, #0 ; Clear stack limit + +#ifdef TX_ENABLE_EXECUTION_CHANGE_NOTIFY +; +; /* Call the ISR enter function to indicate an ISR is executing. */ +; + PUSH {lr} ; Save ISR lr + BL _tx_execution_isr_enter ; Call the ISR enter function + POP {lr} ; Recover ISR lr +#endif + + ADD sp, sp, #32 ; Recover saved registers + MOV pc, lr ; Return to caller +; +; } +;} + END + diff --git a/ports/cortex_r5/iar/src/tx_timer_interrupt.s b/ports/cortex_r5/iar/src/tx_timer_interrupt.s new file mode 100644 index 00000000..007fc2aa --- /dev/null +++ b/ports/cortex_r5/iar/src/tx_timer_interrupt.s @@ -0,0 +1,256 @@ +;/**************************************************************************/ +;/* */ +;/* Copyright (c) Microsoft Corporation. All rights reserved. */ +;/* */ +;/* This software is licensed under the Microsoft Software License */ +;/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +;/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +;/* and in the root directory of this software. */ +;/* */ +;/**************************************************************************/ +; +; +;/**************************************************************************/ +;/**************************************************************************/ +;/** */ +;/** ThreadX Component */ +;/** */ +;/** Timer */ +;/** */ +;/**************************************************************************/ +;/**************************************************************************/ +; +;#define TX_SOURCE_CODE +; +; +;/* Include necessary system files. */ +; +;#include "tx_api.h" +;#include "tx_timer.h" +;#include "tx_thread.h" +; +; +;Define Assembly language external references... +; + EXTERN _tx_timer_time_slice + EXTERN _tx_timer_system_clock + EXTERN _tx_timer_current_ptr + EXTERN _tx_timer_list_start + EXTERN _tx_timer_list_end + EXTERN _tx_timer_expired_time_slice + EXTERN _tx_timer_expired + EXTERN _tx_thread_time_slice + EXTERN _tx_timer_expiration_process +; +; +; +;/**************************************************************************/ +;/* */ +;/* FUNCTION RELEASE */ +;/* */ +;/* _tx_timer_interrupt Cortex-R5/IAR */ +;/* 6.0.1 */ +;/* AUTHOR */ +;/* */ +;/* William E. Lamie, Microsoft Corporation */ +;/* */ +;/* DESCRIPTION */ +;/* */ +;/* This function processes the hardware timer interrupt. This */ +;/* processing includes incrementing the system clock and checking for */ +;/* time slice and/or timer expiration. If either is found, the */ +;/* interrupt context save/restore functions are called along with the */ +;/* expiration functions. */ +;/* */ +;/* INPUT */ +;/* */ +;/* None */ +;/* */ +;/* OUTPUT */ +;/* */ +;/* None */ +;/* */ +;/* CALLS */ +;/* */ +;/* _tx_timer_expiration_process Timer expiration processing */ +;/* _tx_thread_time_slice Time-slice interrupted thread */ +;/* */ +;/* CALLED BY */ +;/* */ +;/* interrupt vector */ +;/* */ +;/* RELEASE HISTORY */ +;/* */ +;/* DATE NAME DESCRIPTION */ +;/* */ +;/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +;/* */ +;/**************************************************************************/ +;VOID _tx_timer_interrupt(VOID) +;{ + RSEG .text:CODE:NOROOT(2) + PUBLIC _tx_timer_interrupt + ARM +_tx_timer_interrupt +; +; /* Upon entry to this routine, it is assumed that context save has already +; been called, and therefore the compiler scratch registers are available +; for use. */ +; +; /* Increment the system clock. */ +; _tx_timer_system_clock++; +; + LDR r1, =_tx_timer_system_clock ; Pickup address of system clock + LDR r0, [r1, #0] ; Pickup system clock + ADD r0, r0, #1 ; Increment system clock + STR r0, [r1, #0] ; Store new system clock +; +; /* Test for time-slice expiration. */ +; if (_tx_timer_time_slice) +; { +; + LDR r3, =_tx_timer_time_slice ; Pickup address of time-slice + LDR r2, [r3, #0] ; Pickup time-slice + CMP r2, #0 ; Is it non-active? + BEQ __tx_timer_no_time_slice ; Yes, skip time-slice processing +; +; /* Decrement the time_slice. */ +; _tx_timer_time_slice--; +; + SUB r2, r2, #1 ; Decrement the time-slice + STR r2, [r3, #0] ; Store new time-slice value +; +; /* Check for expiration. */ +; if (__tx_timer_time_slice == 0) +; + CMP r2, #0 ; Has it expired? + BNE __tx_timer_no_time_slice ; No, skip expiration processing +; +; /* Set the time-slice expired flag. */ +; _tx_timer_expired_time_slice = TX_TRUE; +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup address of expired flag + MOV r0, #1 ; Build expired value + STR r0, [r3, #0] ; Set time-slice expiration flag +; +; } +; +__tx_timer_no_time_slice +; +; /* Test for timer expiration. */ +; if (*_tx_timer_current_ptr) +; { +; + LDR r1, =_tx_timer_current_ptr ; Pickup current timer pointer addr + LDR r0, [r1, #0] ; Pickup current timer + LDR r2, [r0, #0] ; Pickup timer list entry + CMP r2, #0 ; Is there anything in the list? + BEQ __tx_timer_no_timer ; No, just increment the timer +; +; /* Set expiration flag. */ +; _tx_timer_expired = TX_TRUE; +; + LDR r3, =_tx_timer_expired ; Pickup expiration flag address + MOV r2, #1 ; Build expired value + STR r2, [r3, #0] ; Set expired flag + B __tx_timer_done ; Finished timer processing +; +; } +; else +; { +__tx_timer_no_timer +; +; /* No timer expired, increment the timer pointer. */ +; _tx_timer_current_ptr++; +; + ADD r0, r0, #4 ; Move to next timer +; +; /* Check for wrap-around. */ +; if (_tx_timer_current_ptr == _tx_timer_list_end) +; + LDR r3, =_tx_timer_list_end ; Pickup addr of timer list end + LDR r2, [r3, #0] ; Pickup list end + CMP r0, r2 ; Are we at list end? + BNE __tx_timer_skip_wrap ; No, skip wrap-around logic +; +; /* Wrap to beginning of list. */ +; _tx_timer_current_ptr = _tx_timer_list_start; +; + LDR r3, =_tx_timer_list_start ; Pickup addr of timer list start + LDR r0, [r3, #0] ; Set current pointer to list start +; +__tx_timer_skip_wrap +; + STR r0, [r1, #0] ; Store new current timer pointer +; } +; +__tx_timer_done +; +; +; /* See if anything has expired. */ +; if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of expired flag + LDR r2, [r3, #0] ; Pickup time-slice expired flag + CMP r2, #0 ; Did a time-slice expire? + BNE __tx_something_expired ; If non-zero, time-slice expired + LDR r1, =_tx_timer_expired ; Pickup addr of other expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Did a timer expire? + BEQ __tx_timer_nothing_expired ; No, nothing expired +; +__tx_something_expired +; +; + STMDB sp!, {r0, lr} ; Save the lr register on the stack + ; and save r0 just to keep 8-byte alignment +; +; /* Did a timer expire? */ +; if (_tx_timer_expired) +; { +; + LDR r1, =_tx_timer_expired ; Pickup addr of expired flag + LDR r0, [r1, #0] ; Pickup timer expired flag + CMP r0, #0 ; Check for timer expiration + BEQ __tx_timer_dont_activate ; If not set, skip timer activation +; +; /* Process timer expiration. */ +; _tx_timer_expiration_process(); +; + BL _tx_timer_expiration_process ; Call the timer expiration handling routine +; +; } +__tx_timer_dont_activate +; +; /* Did time slice expire? */ +; if (_tx_timer_expired_time_slice) +; { +; + LDR r3, =_tx_timer_expired_time_slice ; Pickup addr of time-slice expired + LDR r2, [r3, #0] ; Pickup the actual flag + CMP r2, #0 ; See if the flag is set + BEQ __tx_timer_not_ts_expiration ; No, skip time-slice processing +; +; /* Time slice interrupted thread. */ +; _tx_thread_time_slice(); + + BL _tx_thread_time_slice ; Call time-slice processing +; +; } +; +__tx_timer_not_ts_expiration +; +; + LDMIA sp!, {r0, lr} ; Recover lr register (r0 is just there for + ; the 8-byte stack alignment +; +; } +; +__tx_timer_nothing_expired +; + BX lr ; Return to caller +; +;} + END + diff --git a/ports/linux/gnu/example_build/file_list.mk b/ports/linux/gnu/example_build/file_list.mk new file mode 100644 index 00000000..73497590 --- /dev/null +++ b/ports/linux/gnu/example_build/file_list.mk @@ -0,0 +1,201 @@ +LINUX_SRCS = \ +tx_initialize_low_level.c \ +tx_thread_context_restore.c \ +tx_thread_context_save.c \ +tx_thread_interrupt_control.c \ +tx_thread_schedule.c \ +tx_thread_stack_build.c \ +tx_thread_system_return.c \ +tx_timer_interrupt.c \ + +LINUX_OBJS = $(LINUX_SRCS:%.c=.tmp/%.o) + + +GENERIC_SRCS = \ +tx_block_allocate.c \ +tx_block_pool_cleanup.c \ +tx_block_pool_create.c \ +tx_block_pool_delete.c \ +tx_block_pool_info_get.c \ +tx_block_pool_initialize.c \ +tx_block_pool_performance_info_get.c \ +tx_block_pool_performance_system_info_get.c \ +tx_block_pool_prioritize.c \ +tx_block_release.c \ +tx_byte_allocate.c \ +tx_byte_pool_cleanup.c \ +tx_byte_pool_create.c \ +tx_byte_pool_delete.c \ +tx_byte_pool_info_get.c \ +tx_byte_pool_initialize.c \ +tx_byte_pool_performance_info_get.c \ +tx_byte_pool_performance_system_info_get.c \ +tx_byte_pool_prioritize.c \ +tx_byte_pool_search.c \ +tx_byte_release.c \ +txe_block_allocate.c \ +txe_block_pool_create.c \ +txe_block_pool_delete.c \ +txe_block_pool_info_get.c \ +txe_block_pool_prioritize.c \ +txe_block_release.c \ +txe_byte_allocate.c \ +txe_byte_pool_create.c \ +txe_byte_pool_delete.c \ +txe_byte_pool_info_get.c \ +txe_byte_pool_prioritize.c \ +txe_byte_release.c \ +txe_event_flags_create.c \ +txe_event_flags_delete.c \ +txe_event_flags_get.c \ +txe_event_flags_info_get.c \ +txe_event_flags_set.c \ +txe_event_flags_set_notify.c \ +txe_mutex_create.c \ +txe_mutex_delete.c \ +txe_mutex_get.c \ +txe_mutex_info_get.c \ +txe_mutex_prioritize.c \ +txe_mutex_put.c \ +txe_queue_create.c \ +txe_queue_delete.c \ +txe_queue_flush.c \ +txe_queue_front_send.c \ +txe_queue_info_get.c \ +txe_queue_prioritize.c \ +txe_queue_receive.c \ +txe_queue_send.c \ +txe_queue_send_notify.c \ +txe_semaphore_ceiling_put.c \ +txe_semaphore_create.c \ +txe_semaphore_delete.c \ +txe_semaphore_get.c \ +txe_semaphore_info_get.c \ +txe_semaphore_prioritize.c \ +txe_semaphore_put.c \ +txe_semaphore_put_notify.c \ +txe_thread_create.c \ +txe_thread_delete.c \ +txe_thread_entry_exit_notify.c \ +txe_thread_info_get.c \ +txe_thread_preemption_change.c \ +txe_thread_priority_change.c \ +txe_thread_relinquish.c \ +txe_thread_reset.c \ +txe_thread_resume.c \ +txe_thread_suspend.c \ +txe_thread_terminate.c \ +txe_thread_time_slice_change.c \ +txe_thread_wait_abort.c \ +txe_timer_activate.c \ +txe_timer_change.c \ +txe_timer_create.c \ +txe_timer_deactivate.c \ +txe_timer_delete.c \ +txe_timer_info_get.c \ +tx_event_flags_cleanup.c \ +tx_event_flags_create.c \ +tx_event_flags_delete.c \ +tx_event_flags_get.c \ +tx_event_flags_info_get.c \ +tx_event_flags_initialize.c \ +tx_event_flags_performance_info_get.c \ +tx_event_flags_performance_system_info_get.c \ +tx_event_flags_set.c \ +tx_event_flags_set_notify.c \ +tx_initialize_high_level.c \ +tx_initialize_kernel_enter.c \ +tx_initialize_kernel_setup.c \ +tx_misra.c \ +tx_mutex_cleanup.c \ +tx_mutex_create.c \ +tx_mutex_delete.c \ +tx_mutex_get.c \ +tx_mutex_info_get.c \ +tx_mutex_initialize.c \ +tx_mutex_performance_info_get.c \ +tx_mutex_performance_system_info_get.c \ +tx_mutex_prioritize.c \ +tx_mutex_priority_change.c \ +tx_mutex_put.c \ +tx_queue_cleanup.c \ +tx_queue_create.c \ +tx_queue_delete.c \ +tx_queue_flush.c \ +tx_queue_front_send.c \ +tx_queue_info_get.c \ +tx_queue_initialize.c \ +tx_queue_performance_info_get.c \ +tx_queue_performance_system_info_get.c \ +tx_queue_prioritize.c \ +tx_queue_receive.c \ +tx_queue_send.c \ +tx_queue_send_notify.c \ +tx_semaphore_ceiling_put.c \ +tx_semaphore_cleanup.c \ +tx_semaphore_create.c \ +tx_semaphore_delete.c \ +tx_semaphore_get.c \ +tx_semaphore_info_get.c \ +tx_semaphore_initialize.c \ +tx_semaphore_performance_info_get.c \ +tx_semaphore_performance_system_info_get.c \ +tx_semaphore_prioritize.c \ +tx_semaphore_put.c \ +tx_semaphore_put_notify.c \ +tx_thread_create.c \ +tx_thread_delete.c \ +tx_thread_entry_exit_notify.c \ +tx_thread_identify.c \ +tx_thread_info_get.c \ +tx_thread_initialize.c \ +tx_thread_performance_info_get.c \ +tx_thread_performance_system_info_get.c \ +tx_thread_preemption_change.c \ +tx_thread_priority_change.c \ +tx_thread_relinquish.c \ +tx_thread_reset.c \ +tx_thread_resume.c \ +tx_thread_shell_entry.c \ +tx_thread_sleep.c \ +tx_thread_stack_analyze.c \ +tx_thread_stack_error_handler.c \ +tx_thread_stack_error_notify.c \ +tx_thread_suspend.c \ +tx_thread_system_preempt_check.c \ +tx_thread_system_resume.c \ +tx_thread_system_suspend.c \ +tx_thread_terminate.c \ +tx_thread_timeout.c \ +tx_thread_time_slice.c \ +tx_thread_time_slice_change.c \ +tx_thread_wait_abort.c \ +tx_time_get.c \ +tx_timer_activate.c \ +tx_timer_change.c \ +tx_timer_create.c \ +tx_timer_deactivate.c \ +tx_timer_delete.c \ +tx_timer_expiration_process.c \ +tx_timer_info_get.c \ +tx_timer_initialize.c \ +tx_timer_performance_info_get.c \ +tx_timer_performance_system_info_get.c \ +tx_timer_system_activate.c \ +tx_timer_system_deactivate.c \ +tx_timer_thread_entry.c \ +tx_time_set.c \ +tx_trace_buffer_full_notify.c \ +tx_trace_disable.c \ +tx_trace_enable.c \ +tx_trace_event_filter.c \ +tx_trace_event_unfilter.c \ +tx_trace_initialize.c \ +tx_trace_interrupt_control.c \ +tx_trace_isr_enter_insert.c \ +tx_trace_isr_exit_insert.c \ +tx_trace_object_register.c \ +tx_trace_object_unregister.c \ +tx_trace_user_event_insert.c \ + +GENERIC_OBJS = $(GENERIC_SRCS:%.c=.tmp/generic/%.o) diff --git a/ports/linux/gnu/example_build/sample_threadx.c b/ports/linux/gnu/example_build/sample_threadx.c new file mode 100644 index 00000000..080be3c4 --- /dev/null +++ b/ports/linux/gnu/example_build/sample_threadx.c @@ -0,0 +1,380 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Print results. */ + printf("**** ThreadX Linux Demonstration **** (c) 1996-2020 Microsoft Corporation\n\n"); + printf(" thread 0 events sent: %lu\n", thread_0_counter); + printf(" thread 1 messages sent: %lu\n", thread_1_counter); + printf(" thread 2 messages received: %lu\n", thread_2_counter); + printf(" thread 3 obtained semaphore: %lu\n", thread_3_counter); + printf(" thread 4 obtained semaphore: %lu\n", thread_4_counter); + printf(" thread 5 events received: %lu\n", thread_5_counter); + printf(" thread 6 mutex obtained: %lu\n", thread_6_counter); + printf(" thread 7 mutex obtained: %lu\n\n", thread_7_counter); + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/linux/gnu/inc/tx_port.h b/ports/linux/gnu/inc/tx_port.h new file mode 100644 index 00000000..9422e100 --- /dev/null +++ b/ports/linux/gnu/inc/tx_port.h @@ -0,0 +1,575 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Linux/GNU */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +#define TX_MAX_PRIORITIES 32 +/* #define TX_MISRA_ENABLE */ + + +/* #define TX_INLINE_INITIALIZATION */ + +/* #define TX_NOT_INTERRUPTABLE */ +/* #define TX_TIMER_PROCESS_IN_ISR */ +/* #define TX_REACTIVATE_INLINE */ +/* #define TX_DISABLE_STACK_FILLING */ +/* #define TX_ENABLE_STACK_CHECKING */ +/* #define TX_DISABLE_PREEMPTION_THRESHOLD */ +/* #define TX_DISABLE_REDUNDANT_CLEARING */ +/* #define TX_DISABLE_NOTIFY_CALLBACKS */ +/* #define TX_INLINE_THREAD_RESUME_SUSPEND */ +/* #define TX_ENABLE_EVENT_TRACE */ + + +/* For MISRA, define enable performance info. Also, for MISRA TX_DISABLE_NOTIFY_CALLBACKS should not be defined. */ + + +/* #define TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO +#define TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO +#define TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO +#define TX_MUTEX_ENABLE_PERFORMANCE_INFO +#define TX_QUEUE_ENABLE_PERFORMANCE_INFO +#define TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO +#define TX_THREAD_ENABLE_PERFORMANCE_INFO +#define TX_TIMER_ENABLE_PERFORMANCE_INFO */ + + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include +#include +#ifndef __USE_POSIX199309 +#define __USE_POSIX199309 +#include +#include +#include +#undef __USE_POSIX199309 +#else /* __USE_POSIX199309 */ +#include +#include +#include +#endif /* __USE_POSIX199309 */ + + +/* Define ThreadX basic types for this port. */ + +typedef void VOID; +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +#if __x86_64__ +typedef int LONG; +typedef unsigned int ULONG; +#else /* __x86_64__ */ +typedef long LONG; +typedef unsigned long ULONG; +#endif /* __x86_64__ */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef uint64_t ULONG64; + + +/* Override the alignment type to use 64-bit alignment and storage for pointers. */ + +#if __x86_64__ +#define ALIGN_TYPE_DEFINED +typedef unsigned long long ALIGN_TYPE; + +/* Override the free block marker for byte pools to be a 64-bit constant. */ + +#define TX_BYTE_BLOCK_FREE ((ALIGN_TYPE) 0xFFFFEEEEFFFFEEEE) +#endif + +/* Define automated coverage test extensions... These are required for the + ThreadX regression test. */ + +typedef unsigned int TEST_FLAG; +extern TEST_FLAG threadx_byte_allocate_loop_test; +extern TEST_FLAG threadx_byte_release_loop_test; +extern TEST_FLAG threadx_mutex_suspension_put_test; +extern TEST_FLAG threadx_mutex_suspension_priority_test; +#ifndef TX_TIMER_PROCESS_IN_ISR +extern TEST_FLAG threadx_delete_timer_thread; +#endif + +extern void abort_and_resume_byte_allocating_thread(void); +extern void abort_all_threads_suspended_on_mutex(void); +extern void suspend_lowest_priority(void); +#ifndef TX_TIMER_PROCESS_IN_ISR +extern void delete_timer_thread(void); +#endif +extern TEST_FLAG test_stack_analyze_flag; +extern TEST_FLAG test_initialize_flag; +extern TEST_FLAG test_forced_mutex_timeout; + + +#ifdef TX_REGRESSION_TEST + +/* Define extension macros for automated coverage tests. */ + + +#define TX_BYTE_ALLOCATE_EXTENSION if (threadx_byte_allocate_loop_test == ((TEST_FLAG) 1)) \ + { \ + pool_ptr -> tx_byte_pool_owner = TX_NULL; \ + threadx_byte_allocate_loop_test = ((TEST_FLAG) 0); \ + } + +#define TX_BYTE_RELEASE_EXTENSION if (threadx_byte_release_loop_test == ((TEST_FLAG) 1)) \ + { \ + threadx_byte_release_loop_test = ((TEST_FLAG) 0); \ + abort_and_resume_byte_allocating_thread(); \ + } + +#define TX_MUTEX_PUT_EXTENSION_1 if (threadx_mutex_suspension_put_test == ((TEST_FLAG) 1)) \ + { \ + threadx_mutex_suspension_put_test = ((TEST_FLAG) 0); \ + abort_all_threads_suspended_on_mutex(); \ + } + + +#define TX_MUTEX_PUT_EXTENSION_2 if (test_forced_mutex_timeout == ((TEST_FLAG) 1)) \ + { \ + test_forced_mutex_timeout = ((TEST_FLAG) 0); \ + _tx_thread_wait_abort(mutex_ptr -> tx_mutex_suspension_list); \ + } + + +#define TX_MUTEX_PRIORITY_CHANGE_EXTENSION if (threadx_mutex_suspension_priority_test == ((TEST_FLAG) 1)) \ + { \ + threadx_mutex_suspension_priority_test = ((TEST_FLAG) 0); \ + suspend_lowest_priority(); \ + } + +#ifndef TX_TIMER_PROCESS_IN_ISR + +#define TX_TIMER_INITIALIZE_EXTENSION(a) if (threadx_delete_timer_thread == ((TEST_FLAG) 1)) \ + { \ + threadx_delete_timer_thread = ((TEST_FLAG) 0); \ + delete_timer_thread(); \ + (a) = ((UINT) 1); \ + } + +#endif + +#define TX_THREAD_STACK_ANALYZE_EXTENSION if (test_stack_analyze_flag == ((TEST_FLAG) 1)) \ + { \ + thread_ptr -> tx_thread_id = ((TEST_FLAG) 0); \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } \ + else if (test_stack_analyze_flag == ((TEST_FLAG) 2)) \ + { \ + stack_ptr = thread_ptr -> tx_thread_stack_start; \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } \ + else if (test_stack_analyze_flag == ((TEST_FLAG) 3)) \ + { \ + *stack_ptr = TX_STACK_FILL; \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } \ + else \ + { \ + test_stack_analyze_flag = ((TEST_FLAG) 0); \ + } + +#define TX_INITIALIZE_KERNEL_ENTER_EXTENSION if (test_initialize_flag == ((TEST_FLAG) 1)) \ + { \ + test_initialize_flag = ((TEST_FLAG) 0); \ + return; \ + } + +#endif + + + +/* Add Linux debug insert prototype. */ + +void _tx_linux_debug_entry_insert(char *action, char *file, unsigned long line); + +#ifndef TX_LINUX_DEBUG_ENABLE + +/* If Linux debug is not enabled, turn logging into white-space. */ + +#define _tx_linux_debug_entry_insert(a, b, c) + +#endif + + + +/* Define the TX_MEMSET macro to remove library reference. */ + +#ifndef TX_MISRA_ENABLE +#define TX_MEMSET(a,b,c) { \ + UCHAR *ptr; \ + UCHAR value; \ + UINT i, size; \ + ptr = (UCHAR *) ((VOID *) a); \ + value = (UCHAR) b; \ + size = (UINT) c; \ + for (i = 0; i < size; i++) \ + { \ + *ptr++ = value; \ + } \ + } +#endif + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 400 /* Default timer thread stack size - Not used in Linux port! */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_MISRA_ENABLE +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ((ULONG) (_tx_linux_time_stamp.tv_nsec)); +#endif +#else +ULONG _tx_misra_time_stamp_get(VOID); +#define TX_TRACE_TIME_SOURCE _tx_misra_time_stamp_get() +#endif + +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port-specific trace extension to pickup the Windows timer. */ + +#define TX_TRACE_PORT_EXTENSION clock_gettime(CLOCK_REALTIME, &_tx_linux_time_stamp); + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#ifdef TX_MISRA_ENABLE +#define TX_DISABLE_INLINE +#else +#define TX_INLINE_INITIALIZATION +#endif + + +/* Define the Linux-specific initialization code that is expanded in the generic source. */ + +void _tx_initialize_start_interrupts(void); + +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION _tx_initialize_start_interrupts(); + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifndef TX_MISRA_ENABLE +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 pthread_t tx_thread_linux_thread_id; \ + sem_t tx_thread_linux_thread_run_semaphore; \ + UINT tx_thread_linux_suspension_type; \ + UINT tx_thread_linux_int_disabled_flag; + +#define TX_THREAD_EXTENSION_1 VOID *tx_thread_extension_ptr; +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + +struct TX_THREAD_STRUCT; + +/* Define post completion processing for tx_thread_delete, so that the Linux thread resources are properly removed. */ + +void _tx_thread_delete_port_completion(struct TX_THREAD_STRUCT *thread_ptr, UINT tx_saved_posture); +#define TX_THREAD_DELETE_PORT_COMPLETION(thread_ptr) _tx_thread_delete_port_completion(thread_ptr, tx_saved_posture); + +/* Define post completion processing for tx_thread_reset, so that the Linux thread resources are properly removed. */ + +void _tx_thread_reset_port_completion(struct TX_THREAD_STRUCT *thread_ptr, UINT tx_saved_posture); +#define TX_THREAD_RESET_PORT_COMPLETION(thread_ptr) _tx_thread_reset_port_completion(thread_ptr, tx_saved_posture); + +#if __x86_64__ +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + +/* Define the internal timer extension to also hold the thread pointer such that _tx_thread_timeout + can figure out what thread timeout to process. */ + +#define TX_TIMER_INTERNAL_EXTENSION VOID *tx_timer_internal_extension_ptr; + + +/* Define the thread timeout setup logic in _tx_thread_create. */ + +#define TX_THREAD_CREATE_TIMEOUT_SETUP(t) (t) -> tx_thread_timer.tx_timer_internal_timeout_function = &(_tx_thread_timeout); \ + (t) -> tx_thread_timer.tx_timer_internal_timeout_param = 0; \ + (t) -> tx_thread_timer.tx_timer_internal_extension_ptr = (VOID *) (t); + + +/* Define the thread timeout pointer setup in _tx_thread_timeout. */ + +#define TX_THREAD_TIMEOUT_POINTER_SETUP(t) (t) = (TX_THREAD *) _tx_timer_expired_timer_ptr -> tx_timer_internal_extension_ptr; +#endif /* __x86_64__ */ + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +UINT _tx_thread_interrupt_disable(void); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA UINT tx_saved_posture; + +#ifndef TX_LINUX_DEBUG_ENABLE +#define TX_DISABLE tx_saved_posture = _tx_thread_interrupt_disable(); +#define TX_RESTORE _tx_thread_interrupt_restore(tx_saved_posture); +#else +#define TX_DISABLE _tx_linux_debug_entry_insert("DISABLE", __FILE__, __LINE__); \ + tx_saved_posture = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_linux_debug_entry_insert("RESTORE", __FILE__, __LINE__); \ + _tx_thread_interrupt_restore(tx_saved_posture); +#endif /* TX_LINUX_DEBUG_ENABLE */ +#define tx_linux_mutex_lock(p) pthread_mutex_lock(&p) +#define tx_linux_mutex_unlock(p) pthread_mutex_unlock(&p) +#define tx_linux_mutex_recursive_unlock(p) {\ + int _recursive_count = tx_linux_mutex_recursive_count;\ + while(_recursive_count)\ + {\ + pthread_mutex_unlock(&p);\ + _recursive_count--;\ + }\ + } +#define tx_linux_mutex_recursive_count _tx_linux_mutex.__data.__count +#define tx_linux_sem_post(p) tx_linux_mutex_lock(_tx_linux_mutex);\ + sem_post(p);\ + tx_linux_mutex_unlock(_tx_linux_mutex) +#define tx_linux_sem_post_nolock(p) sem_post(p) +#define tx_linux_sem_wait(p) sem_wait(p) + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation * ThreadX Linux/gcc Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +/* Define externals for the Linux port of ThreadX. */ + +extern pthread_mutex_t _tx_linux_mutex; +extern sem_t _tx_linux_semaphore; +extern sem_t _tx_linux_semaphore_no_idle; +extern ULONG _tx_linux_global_int_disabled_flag; +extern struct timespec _tx_linux_time_stamp; +extern __thread int _tx_linux_threadx_thread; + +/* Define functions for linux thread. */ +void _tx_linux_thread_suspend(pthread_t thread_id); +void _tx_linux_thread_resume(pthread_t thread_id); +void _tx_linux_thread_init(); + +#ifndef TX_LINUX_MEMORY_SIZE +#define TX_LINUX_MEMORY_SIZE 64000 +#endif + +#define TX_TIMER_TICKS_PER_SECOND 100UL + +/* Define priorities of pthreads. */ + +#define TX_LINUX_PRIORITY_SCHEDULE (3) +#define TX_LINUX_PRIORITY_ISR (2) +#define TX_LINUX_PRIORITY_USER_THREAD (1) + +#endif + diff --git a/ports/linux/gnu/readme_threadx.txt b/ports/linux/gnu/readme_threadx.txt new file mode 100644 index 00000000..5fdd6c3f --- /dev/null +++ b/ports/linux/gnu/readme_threadx.txt @@ -0,0 +1,155 @@ + Microsoft's Azure RTOS ThreadX for Linux + + Using the GNU GCC Tools + +1. Building the ThreadX run-time Library + +First make sure you are in the "example_build" directory. Also, make sure that +you have setup your path and other environment variables necessary for the GNU +development environment. The following command retrieves and installs GCC +multilib on a Ubuntu system: + +sudo apt-get install gcc-multilib + +At this point you may run the GNU make command to build the ThreadX core +library. This will build the ThreadX run-time environment in the +"example_build" directory. + + make tx.a + +you should now observe the compilation of the ThreadX library source. At the +end of the make, they are all combined into the run-time library file: tx.a. +This file must be linked with your application in order to use ThreadX. + + +2. Demonstration System + +Building the demonstration is easy; simply execute the GNU make command while +inside the "example_build" directory. + + make sample_threadx + +You should observe the compilation of sample_threadx.c (which is the demonstration +application) and linking with tx.a. The resulting file DEMO is a binary file +that can be executed. + + +3. System Initialization + +The system entry point is at main(), which is defined in the application. +Once the application calls tx_kernel_enter, ThreadX starts running and +performs various initialization duties prior to starting the scheduler. The +Linux-specific initialization is done in the function _tx_initialize_low_level, +which is located in the file tx_initialize_low_level.c. This function is +responsible for setting up various system data structures and simulated +interrupts - including the periodic timer interrupt source for ThreadX. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application. In Linux, this is basically done +by using malloc to get a big block of memory from Linux. + + +4. Linux Implementation + +ThreadX for Linux is implemented using POSIX pthreads. Each application +thread in ThreadX actually runs as a Linux pthread. The determination of +which application thread to run is made by the ThreadX scheduler, which +itself is a Linux pthread. The ThreadX scheduler is the highest priority +thread in the system. + +Interrupts in ThreadX/Linux are also simulated by pthreads. A good example +is the ThreadX system timer interrupt, which can be found in +tx_initialize_low_level.c. + +ThreadX for linux utilizes the API pthread_setschedparam() which requires +the ThreadX application running with privilege. The following command is used +to run a ThreadX application: + +./sample_threadx + +5. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the makefile to +enable all compiler optimizations. In addition, you can eliminate the +ThreadX basic API error checking by compiling your application code with the +symbol TX_DISABLE_ERROR_CHECKING defined. + + +6. Interrupt Handling + +ThreadX provides simulated interrupt handling with Linux pthreads. Simulated +interrupt threads may be created by the application or may be added to the +simulated timer interrupt defined in tx_initialize_low_level.c. The following +format for creating simulated interrupts should be used: + +6.1 Data structures + +Here is an example of how to define the Linux data structures and prototypes +necessary to create a simulated interrupt thread: + +pthread_t _sample_linux_interrupt_thread; +void *_sample_linux_interrupt_entry(void *p); + +6.2 Creating a Simulated Interrupt Thread + +Here is an example of how to create a simulated interrupt thread in Linux. +This may be done inside of tx_initialize_low_level.c or from your application code + + +struct sched_param sp; + + /* Create the ISR thread */ + pthread_create(&_sample_linux_interrupt_thread, NULL, _sample_linux_interrupt_entry, &_sample_linux_interrupt_thread); + + /* Set up the ISR priority */ + sp.sched_priority = TX_LINUX_PRIORITY_ISR; + pthread_setschedparam(_sample_linux_interrupt_thread, SCHED_FIFO, &sp); + + + +6.3 Simulated Interrupt Thread Template + +The following is a template for the simulated interrupt thread. This interrupt will occur on +a periodic basis. + +void *_sample_linux_interrupt_entry(void *p) +{ +struct timespec ts; + + while(1) + { + + ts.tv_sec = 0; + ts.tv_nsec = 10000; + while(nanosleep(&ts, &ts)); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + /* Call the real ISR routine */ + _sample_linux_interrupt_isr(); + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + } +} + + + +7. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX 6.0.1 version for Linux using GNU GCC tools. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/linux/gnu/src/tx_initialize_low_level.c b/ports/linux/gnu/src/tx_initialize_low_level.c new file mode 100644 index 00000000..f8cd604b --- /dev/null +++ b/ports/linux/gnu/src/tx_initialize_low_level.c @@ -0,0 +1,443 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include +#include +#include +#include +#include +#include + + +/* Define various Linux objects used by the ThreadX port. */ + +pthread_mutex_t _tx_linux_mutex; +sem_t _tx_linux_semaphore; +sem_t _tx_linux_semaphore_no_idle; +ULONG _tx_linux_global_int_disabled_flag; +struct timespec _tx_linux_time_stamp; +__thread int _tx_linux_threadx_thread = 0; + +/* Define signals for linux thread. */ +#define SUSPEND_SIG SIGUSR1 +#define RESUME_SIG SIGUSR2 + +static sigset_t _tx_linux_thread_wait_mask; +static __thread int _tx_linux_thread_suspended; +static sem_t _tx_linux_thread_timer_wait; +static sem_t _tx_linux_thread_other_wait; + +/* Define simulated timer interrupt. This is done inside a thread, which is + how other interrupts may be defined as well. See code below for an + example. */ + +pthread_t _tx_linux_timer_id; +sem_t _tx_linux_timer_semaphore; +sem_t _tx_linux_isr_semaphore; +void *_tx_linux_timer_interrupt(void *p); + + +#ifdef TX_LINUX_DEBUG_ENABLE + +extern ULONG _tx_thread_system_state; +extern UINT _tx_thread_preempt_disable; +extern TX_THREAD *_tx_thread_current_ptr; +extern TX_THREAD *_tx_thread_execute_ptr; + + +/* Define debug log in order to debug Linux issues with this port. */ + +typedef struct TX_LINUX_DEBUG_ENTRY_STRUCT +{ + char *tx_linux_debug_entry_action; + struct timespec tx_linux_debug_entry_timestamp; + char *tx_linux_debug_entry_file; + unsigned long tx_linux_debug_entry_line; + pthread_mutex_t tx_linux_debug_entry_mutex; + unsigned long tx_linux_debug_entry_int_disabled_flag; + ULONG tx_linux_debug_entry_system_state; + UINT tx_linux_debug_entry_preempt_disable; + TX_THREAD *tx_linux_debug_entry_current_thread; + TX_THREAD *tx_linux_debug_entry_execute_thread; +} TX_LINUX_DEBUG_ENTRY; + + +/* Define the maximum size of the Linux debug array. */ + +#ifndef TX_LINUX_DEBUG_EVENT_SIZE +#define TX_LINUX_DEBUG_EVENT_SIZE 400 +#endif + + +/* Define the circular array of Linux debug entries. */ + +TX_LINUX_DEBUG_ENTRY _tx_linux_debug_entry_array[TX_LINUX_DEBUG_EVENT_SIZE]; + + +/* Define the Linux debug index. */ + +unsigned long _tx_linux_debug_entry_index = 0; + + +/* Now define the debug entry function. */ +void _tx_linux_debug_entry_insert(char *action, char *file, unsigned long line) +{ + +pthread_mutex_t temp_copy; + + /* Save the current critical section value. */ + temp_copy = _tx_linux_mutex; + + /* Lock mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Get the time stamp. */ + clock_gettime(CLOCK_REALTIME, &_tx_linux_time_stamp); + + /* Setup the debub entry. */ + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_action = action; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_timestamp = _tx_linux_time_stamp; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_file = file; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_line = line; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_mutex = temp_copy; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_int_disabled_flag = _tx_linux_global_int_disabled_flag; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_system_state = _tx_thread_system_state; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_preempt_disable = _tx_thread_preempt_disable; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_current_thread = _tx_thread_current_ptr; + _tx_linux_debug_entry_array[_tx_linux_debug_entry_index].tx_linux_debug_entry_execute_thread = _tx_thread_execute_ptr; + + /* Now move to the next entry. */ + _tx_linux_debug_entry_index++; + + /* Determine if we need to wrap the list. */ + if (_tx_linux_debug_entry_index >= TX_LINUX_DEBUG_EVENT_SIZE) + { + + /* Yes, wrap the list! */ + _tx_linux_debug_entry_index = 0; + } + + /* Unlock mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); +} + +#endif + + +/* Define the ThreadX timer interrupt handler. */ + +void _tx_timer_interrupt(void); + + +/* Define other external function references. */ + +VOID _tx_initialize_low_level(VOID); +VOID _tx_thread_context_save(VOID); +VOID _tx_thread_context_restore(VOID); + + +/* Define other external variable references. */ + +extern VOID *_tx_initialize_unused_memory; + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* sched_setaffinity */ +/* getpid */ +/* _tx_linux_thread_init */ +/* pthread_setschedparam */ +/* pthread_mutexattr_init */ +/* pthread_mutex_init */ +/* _tx_linux_thread_suspend */ +/* sem_init */ +/* pthread_create */ +/* printf */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_initialize_low_level(VOID) +{ +struct sched_param sp; +pthread_mutexattr_t attr; + +#ifdef TX_LINUX_MULTI_CORE +cpu_set_t mask; + + sched_getaffinity(getpid(), sizeof(mask), &mask); + if (CPU_COUNT(&mask) > 1) + { + + srand((ULONG)pthread_self()); + + /* Limit this ThreadX simulation on Linux to a single core. */ + CPU_ZERO(&mask); + CPU_SET(rand() % get_nprocs(), &mask); + if (sched_setaffinity(getpid(), sizeof(mask), &mask) != 0) + { + + /* Error restricting the process to one core. */ + printf("ThreadX Linux error restricting the process to one core!\n"); + while(1) + { + } + } + } +#endif + + /* Pickup the first available memory address. */ + + /* Save the first available memory address. */ + _tx_initialize_unused_memory = malloc(TX_LINUX_MEMORY_SIZE); + + /* Init Linux thread. */ + _tx_linux_thread_init(); + + /* Set priority and schedual of main thread. */ + sp.sched_priority = TX_LINUX_PRIORITY_SCHEDULE; + pthread_setschedparam(pthread_self(), SCHED_FIFO, &sp); + + /* Create the system critical section. This is used by the + scheduler thread (which is the main thread) to block all + other stuff out. */ + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_tx_linux_mutex, &attr); + sem_init(&_tx_linux_semaphore, 0, 0); +#ifdef TX_LINUX_NO_IDLE_ENABLE + sem_init(&_tx_linux_semaphore_no_idle, 0, 0); +#endif /* TX_LINUX_NO_IDLE_ENABLE */ + + /* Initialize the global interrupt disabled flag. */ + _tx_linux_global_int_disabled_flag = TX_FALSE; + + /* Create semaphore for timer thread. */ + sem_init(&_tx_linux_timer_semaphore, 0, 0); + + /* Create semaphore for ISR thread. */ + sem_init(&_tx_linux_isr_semaphore, 0, 0); + + /* Setup periodic timer interrupt. */ + if(pthread_create(&_tx_linux_timer_id, NULL, _tx_linux_timer_interrupt, NULL)) + { + + /* Error creating the timer interrupt. */ + printf("ThreadX Linux error creating timer interrupt thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. Now set the priority to + a level lower than the system thread but higher than the application + threads. */ + sp.sched_priority = TX_LINUX_PRIORITY_ISR; + pthread_setschedparam(_tx_linux_timer_id, SCHED_FIFO, &sp); + + /* Done, return to caller. */ +} + + +/* This routine is called after initialization is complete in order to start + all interrupt threads. Interrupt threads in addition to the timer may + be added to this routine as well. */ + +void _tx_initialize_start_interrupts(void) +{ + + /* Kick the timer thread off to generate the ThreadX periodic interrupt + source. */ + tx_linux_sem_post(&_tx_linux_timer_semaphore); +} + + +/* Define the ThreadX system timer interrupt. Other interrupts may be simulated + in a similar way. */ + +void *_tx_linux_timer_interrupt(void *p) +{ +struct timespec ts; +long timer_periodic_nsec; +int err; + + /* Calculate periodic timer. */ + timer_periodic_nsec = 1000000000 / TX_TIMER_TICKS_PER_SECOND; + nice(10); + + /* Wait startup semaphore. */ + tx_linux_sem_wait(&_tx_linux_timer_semaphore); + + while(1) + { + + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += timer_periodic_nsec; + if (ts.tv_nsec > 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec++; + } + do + { + if (sem_timedwait(&_tx_linux_timer_semaphore, &ts) == 0) + { + break; + } + err = errno; + } while (err != ETIMEDOUT); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + /* Call trace ISR enter event insert. */ + _tx_trace_isr_enter_insert(0); + + /* Call the ThreadX system timer interrupt processing. */ + _tx_timer_interrupt(); + + /* Call trace ISR exit event insert. */ + _tx_trace_isr_exit_insert(0); + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + +#ifdef TX_LINUX_NO_IDLE_ENABLE + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_semaphore_no_idle)); + + /* Wakeup the system thread by setting the system semaphore. */ + tx_linux_sem_post(&_tx_linux_semaphore_no_idle); + + tx_linux_mutex_unlock(_tx_linux_mutex); +#endif /* TX_LINUX_NO_IDLE_ENABLE */ + } +} + +/* Define functions for linux thread. */ +void _tx_linux_thread_resume_handler(int sig) +{ +} + +void _tx_linux_thread_suspend_handler(int sig) +{ + if(pthread_equal(pthread_self(), _tx_linux_timer_id)) + tx_linux_sem_post_nolock(&_tx_linux_thread_timer_wait); + else + tx_linux_sem_post_nolock(&_tx_linux_thread_other_wait); + + if(_tx_linux_thread_suspended) + return; + + _tx_linux_thread_suspended = 1; + sigsuspend(&_tx_linux_thread_wait_mask); + _tx_linux_thread_suspended = 0; +} + +void _tx_linux_thread_suspend(pthread_t thread_id) +{ + + /* Send signal. */ + tx_linux_mutex_lock(_tx_linux_mutex); + pthread_kill(thread_id, SUSPEND_SIG); + tx_linux_mutex_unlock(_tx_linux_mutex); + + /* Wait until signal is received. */ + if(pthread_equal(thread_id, _tx_linux_timer_id)) + tx_linux_sem_wait(&_tx_linux_thread_timer_wait); + else + tx_linux_sem_wait(&_tx_linux_thread_other_wait); +} + +void _tx_linux_thread_resume(pthread_t thread_id) +{ + + /* Send signal. */ + tx_linux_mutex_lock(_tx_linux_mutex); + pthread_kill(thread_id, RESUME_SIG); + tx_linux_mutex_unlock(_tx_linux_mutex); +} + +void _tx_linux_thread_init() +{ +struct sigaction sa; + + /* Create semaphore for linux thread. */ + sem_init(&_tx_linux_thread_timer_wait, 0, 0); + sem_init(&_tx_linux_thread_other_wait, 0, 0); + + sigfillset(&_tx_linux_thread_wait_mask); + sigdelset(&_tx_linux_thread_wait_mask, RESUME_SIG); + + sigfillset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = _tx_linux_thread_resume_handler; + sigaction(RESUME_SIG, &sa, NULL); + + sa.sa_handler = _tx_linux_thread_suspend_handler; + sigaction(SUSPEND_SIG, &sa, NULL); +} + + diff --git a/ports/linux/gnu/src/tx_thread_context_restore.c b/ports/linux/gnu/src/tx_thread_context_restore.c new file mode 100644 index 00000000..ab24759e --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_context_restore.c @@ -0,0 +1,163 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + +extern sem_t _tx_linux_isr_semaphore; +UINT _tx_linux_timer_waiting = 0; +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* sem_trywait */ +/* tx_linux_sem_post */ +/* tx_linux_sem_wait */ +/* _tx_linux_thread_resume */ +/* tx_linux_mutex_recursive_unlock */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_restore(VOID) +{ + + /* Debug entry. */ + _tx_linux_debug_entry_insert("CONTEXT_RESTORE", __FILE__, __LINE__); + + /* Lock mutex to ensure other threads are not playing with + the core ThreadX data structures. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Decrement the nested interrupt count. */ + _tx_thread_system_state--; + + /* Determine if this is the first nested interrupt and if a ThreadX + application thread was running at the time. */ + if ((!_tx_thread_system_state) && (_tx_thread_current_ptr)) + { + + /* Yes, this is the first and last interrupt processed. */ + + /* Check to see if preemption is required. */ + if ((_tx_thread_preempt_disable == 0) && (_tx_thread_current_ptr != _tx_thread_execute_ptr)) + { + + /* Preempt the running application thread. We don't need to suspend the + application thread since that is done in the context save processing. */ + + /* Indicate that this thread was suspended asynchronously. */ + _tx_thread_current_ptr -> tx_thread_linux_suspension_type = 1; + + /* Save the remaining time-slice and disable it. */ + if (_tx_timer_time_slice) + { + + _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Clear the current thread pointer. */ + _tx_thread_current_ptr = TX_NULL; + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_semaphore)); + + /* Indicate it is in timer ISR. */ + _tx_linux_timer_waiting = 1; + + /* Wakeup the system thread by setting the system semaphore. */ + tx_linux_sem_post(&_tx_linux_semaphore); + + if(_tx_thread_execute_ptr) + { + if(_tx_thread_execute_ptr -> tx_thread_linux_suspension_type == 0) + { + + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + + /* Wait until TX_THREAD start running. */ + tx_linux_sem_wait(&_tx_linux_isr_semaphore); + + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_isr_semaphore)); + } + } + + /* Indicate it is not in timer ISR. */ + _tx_linux_timer_waiting = 0; + } + else + { + + /* Since preemption is not required, resume the interrupted thread. */ + _tx_linux_thread_resume(_tx_thread_current_ptr -> tx_thread_linux_thread_id); + } + } + + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); +} + diff --git a/ports/linux/gnu/src/tx_thread_context_save.c b/ports/linux/gnu/src/tx_thread_context_save.c new file mode 100644 index 00000000..d2b54b23 --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_context_save.c @@ -0,0 +1,107 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* _tx_linux_thread_suspend */ +/* tx_linux_mutex_unlock */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_save(VOID) +{ + + /* Debug entry. */ + _tx_linux_debug_entry_insert("CONTEXT_SAVE", __FILE__, __LINE__); + + /* Lock mutex to ensure other threads are not playing with + the core ThreadX data structures. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* If an application thread is running, suspend it to simulate preemption. */ + if ((_tx_thread_current_ptr) && (_tx_thread_system_state == 0)) + { + + /* Debug entry. */ + _tx_linux_debug_entry_insert("CONTEXT_SAVE-suspend_thread", __FILE__, __LINE__); + + /* Yes, this is the first interrupt and an application thread is running... + suspend it! */ + _tx_linux_thread_suspend(_tx_thread_current_ptr -> tx_thread_linux_thread_id); + + /* Indicate that this thread was suspended asynchronously. */ + _tx_thread_current_ptr -> tx_thread_linux_suspension_type = 1; + } + + /* Increment the nested interrupt condition. */ + _tx_thread_system_state++; + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); +} + diff --git a/ports/linux/gnu/src/tx_thread_interrupt_control.c b/ports/linux/gnu/src/tx_thread_interrupt_control.c new file mode 100644 index 00000000..ea75e19f --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_interrupt_control.c @@ -0,0 +1,183 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + +/* Define small routines used for the TX_DISABLE/TX_RESTORE macros. */ + +UINT _tx_thread_interrupt_disable(void) +{ + +UINT previous_value; + + + previous_value = _tx_thread_interrupt_control(TX_INT_DISABLE); + return(previous_value); +} + + +VOID _tx_thread_interrupt_restore(UINT previous_posture) +{ + + previous_posture = _tx_thread_interrupt_control(previous_posture); +} + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* tx_linux_mutex_lock */ +/* pthread_self */ +/* pthread_getschedparam */ +/* tx_linux_mutex_recursive_unlock */ +/* pthread_exit */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +UINT _tx_thread_interrupt_control(UINT new_posture) +{ + +UINT old_posture; +TX_THREAD *thread_ptr; +pthread_t thread_id; +int exit_code = 0; + + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Pickup the id of the current thread. */ + thread_id = pthread_self(); + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread and it does not + match the current thread pointer. */ + if ((_tx_linux_threadx_thread) && + ((!thread_ptr) || (!pthread_equal(thread_ptr -> tx_thread_linux_thread_id, thread_id)))) + { + + /* This indicates the Linux thread was actually terminated by ThreadX is only + being allowed to run in order to cleanup its resources. */ + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + pthread_exit((void *)&exit_code); + } + + /* Determine the current interrupt lockout condition. */ + if (tx_linux_mutex_recursive_count == 1) + { + + /* Interrupts are enabled. */ + old_posture = TX_INT_ENABLE; + } + else + { + + /* Interrupts are disabled. */ + old_posture = TX_INT_DISABLE; + } + + /* First, determine if this call is from a non-thread. */ + if (_tx_thread_system_state) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_linux_global_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_linux_global_int_disabled_flag = TX_TRUE; + } + } + else if (thread_ptr) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_linux_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_linux_int_disabled_flag = TX_TRUE; + } + } + + /* Return the previous interrupt disable posture. */ + return(old_posture); +} + diff --git a/ports/linux/gnu/src/tx_thread_schedule.c b/ports/linux/gnu/src/tx_thread_schedule.c new file mode 100644 index 00000000..7843a3ec --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_schedule.c @@ -0,0 +1,264 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +#include +#include + +extern sem_t _tx_linux_timer_semaphore; +extern sem_t _tx_linux_isr_semaphore; +extern UINT _tx_linux_timer_waiting; +extern pthread_t _tx_linux_timer_id; +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* tx_linux_mutex_lock */ +/* tx_linux_mutex_unlock */ +/* _tx_linux_debug_entry_insert */ +/* _tx_linux_thread_resume */ +/* tx_linux_sem_post */ +/* sem_trywait */ +/* tx_linux_sem_wait */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_schedule(VOID) +{ +struct timespec ts; + + /* Set timer. */ + ts.tv_sec = 0; + ts.tv_nsec = 200000; + + /* Loop forever. */ + while(1) + { + + /* Wait for a thread to execute and all ISRs to complete. */ + while(1) + { + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Determine if there is a thread ready to execute AND all ISRs + are complete. */ + if ((_tx_thread_execute_ptr != TX_NULL) && (_tx_thread_system_state == 0)) + { + + /* Get out of this loop and schedule the thread! */ + break; + } + else + { + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); + + /* Don't waste all the processor time here in the master thread... */ +#ifdef TX_LINUX_NO_IDLE_ENABLE + while(!sem_trywait(&_tx_linux_timer_semaphore)); + tx_linux_sem_post(&_tx_linux_timer_semaphore); + /*nanosleep(&ts, &ts);*/ + + clock_gettime(CLOCK_REALTIME, &ts); + ts.tv_nsec += 200000; + if (ts.tv_nsec > 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec++; + } + sem_timedwait(&_tx_linux_semaphore_no_idle, &ts); +#else + nanosleep(&ts, &ts); +#endif /* TX_LINUX_NO_IDLE_ENABLE */ + } + } + + /* Yes! We have a thread to execute. Note that the critical section is already + active from the scheduling loop above. */ + + /* Setup the current thread pointer. */ + _tx_thread_current_ptr = _tx_thread_execute_ptr; + + /* Increment the run count for this thread. */ + _tx_thread_current_ptr -> tx_thread_run_count++; + + /* Setup time-slice, if present. */ + _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; + + /* Determine how the thread was suspended. */ + if (_tx_thread_current_ptr -> tx_thread_linux_suspension_type) + { + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-resume_thread", __FILE__, __LINE__); + + /* Pseudo interrupt suspension. The thread is not waiting on + its run semaphore. */ + _tx_linux_thread_resume(_tx_thread_current_ptr -> tx_thread_linux_thread_id); + } + else + { + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-release_sem", __FILE__, __LINE__); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_thread_current_ptr -> tx_thread_linux_thread_run_semaphore)); + + /* Let the thread run again by releasing its run semaphore. */ + tx_linux_sem_post(&_tx_thread_current_ptr -> tx_thread_linux_thread_run_semaphore); + + /* Block timer ISR. */ + if(_tx_linux_timer_waiting) + { + + /* It is woken up by timer ISR. */ + /* Let ThreadX thread wake up first. */ + tx_linux_sem_wait(&_tx_linux_semaphore); + + /* Wake up timer ISR. */ + tx_linux_sem_post_nolock(&_tx_linux_isr_semaphore); + } + else + { + + /* It is woken up by TX_THREAD. */ + /* Suspend timer thread and let ThreadX thread wake up first. */ + _tx_linux_thread_suspend(_tx_linux_timer_id); + tx_linux_sem_wait(&_tx_linux_semaphore); + _tx_linux_thread_resume(_tx_linux_timer_id); + + } + } + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-self_suspend_sem", __FILE__, __LINE__); + + /* Now suspend the main thread so the application thread can run. */ + tx_linux_sem_wait(&_tx_linux_semaphore); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SCHEDULE-wake_up", __FILE__, __LINE__); + + } +} + +void _tx_thread_delete_port_completion(TX_THREAD *thread_ptr, UINT tx_saved_posture) +{ +INT linux_status; +sem_t *threadrunsemaphore; +pthread_t thread_id; +struct timespec ts; + + thread_id = thread_ptr -> tx_thread_linux_thread_id; + threadrunsemaphore = &(thread_ptr -> tx_thread_linux_thread_run_semaphore); + ts.tv_sec = 0; + ts.tv_nsec = 1000000; + TX_RESTORE + do + { + linux_status = pthread_cancel(thread_id); + if(linux_status != EAGAIN) + { + break; + } + _tx_linux_thread_resume(thread_id); + tx_linux_sem_post(threadrunsemaphore); + nanosleep(&ts, &ts); + } while (1); + pthread_join(thread_id, NULL); + sem_destroy(threadrunsemaphore); + TX_DISABLE +} + +void _tx_thread_reset_port_completion(TX_THREAD *thread_ptr, UINT tx_saved_posture) +{ +INT linux_status; +sem_t *threadrunsemaphore; +pthread_t thread_id; +struct timespec ts; + + thread_id = thread_ptr -> tx_thread_linux_thread_id; + threadrunsemaphore = &(thread_ptr -> tx_thread_linux_thread_run_semaphore); + ts.tv_sec = 0; + ts.tv_nsec = 1000000; + TX_RESTORE + do + { + linux_status = pthread_cancel(thread_id); + if(linux_status != EAGAIN) + { + break; + } + _tx_linux_thread_resume(thread_id); + tx_linux_sem_post(threadrunsemaphore); + nanosleep(&ts, &ts); + } while (1); + pthread_join(thread_id, NULL); + sem_destroy(threadrunsemaphore); + TX_DISABLE +} diff --git a/ports/linux/gnu/src/tx_thread_stack_build.c b/ports/linux/gnu/src/tx_thread_stack_build.c new file mode 100644 index 00000000..b18ae2fb --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_stack_build.c @@ -0,0 +1,153 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include +#include + + +/* Prototype for new thread entry function. */ + +void *_tx_linux_thread_entry(void *ptr); + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* pthread_create */ +/* pthread_setschedparam */ +/* _tx_linux_thread_suspend */ +/* sem_init */ +/* printf */ +/* _tx_linux_thread_resume */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* _tx_thread_reset Reset thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +{ +struct sched_param sp; + + /* Create the run semaphore for the thread. This will allow the scheduler + control over when the thread actually runs. */ + if(sem_init(&thread_ptr -> tx_thread_linux_thread_run_semaphore, 0, 0)) + { + + /* Display an error message. */ + printf("ThreadX Linux error creating thread running semaphore!\n"); + while(1) + { + } + } + + /* Create a Linux thread for the application thread. */ + if(pthread_create(&thread_ptr -> tx_thread_linux_thread_id, NULL, _tx_linux_thread_entry, thread_ptr)) + { + + /* Display an error message. */ + printf("ThreadX Linux error creating thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. */ + sp.sched_priority = TX_LINUX_PRIORITY_USER_THREAD; + pthread_setschedparam(thread_ptr -> tx_thread_linux_thread_id, SCHED_FIFO, &sp); + + /* Setup the thread suspension type to solicited thread suspension. + Pseudo interrupt handlers will suspend with this field set to 1. */ + thread_ptr -> tx_thread_linux_suspension_type = 0; + + /* Clear the disabled count that will keep track of the + tx_interrupt_control nesting. */ + thread_ptr -> tx_thread_linux_int_disabled_flag = 0; + + /* Setup a fake thread stack pointer. */ + thread_ptr -> tx_thread_stack_ptr = (VOID *) (((CHAR *) thread_ptr -> tx_thread_stack_end) - 8); + + /* Clear the first word of the stack. */ + *(((ULONG *) thread_ptr -> tx_thread_stack_ptr) - 1) = 0; +} + + +void *_tx_linux_thread_entry(void *ptr) +{ + +TX_THREAD *thread_ptr; + + /* Pickup the current thread pointer. */ + thread_ptr = (TX_THREAD *) ptr; + _tx_linux_threadx_thread = 1; + nice(20); + + /* Now suspend the thread initially. If the thread has already + been scheduled, this will return immediately. */ + tx_linux_sem_wait(&thread_ptr -> tx_thread_linux_thread_run_semaphore); + tx_linux_sem_post_nolock(&_tx_linux_semaphore); + + /* Call ThreadX thread entry point. */ + _tx_thread_shell_entry(); + + return EXIT_SUCCESS; +} + diff --git a/ports/linux/gnu/src/tx_thread_system_return.c b/ports/linux/gnu/src/tx_thread_system_return.c new file mode 100644 index 00000000..9ee68d0d --- /dev/null +++ b/ports/linux/gnu/src/tx_thread_system_return.c @@ -0,0 +1,207 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +#include + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the system. Only a minimal context */ +/* is saved since the compiler assumes temp registers are going to get */ +/* slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* pthread_self */ +/* pthread_getschedparam */ +/* pthread_equal */ +/* tx_linux_mutex_recursive_unlock */ +/* tx_linux_mutex_unlock */ +/* pthread_exit */ +/* tx_linux_sem_post */ +/* sem_trywait */ +/* tx_linux_sem_wait */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_system_return(VOID) +{ + +TX_THREAD *temp_thread_ptr; +sem_t *temp_run_semaphore; +UINT temp_thread_state; +pthread_t thread_id; +int exit_code = 0; + + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN", __FILE__, __LINE__); + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* First, determine if the thread was terminated. */ + + /* Pickup the id of the current thread. */ + thread_id = pthread_self(); + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread (0) and it does not + match the current thread pointer. */ + if ((_tx_linux_threadx_thread) && + ((!temp_thread_ptr) || (!pthread_equal(temp_thread_ptr -> tx_thread_linux_thread_id, thread_id)))) + { + + /* This indicates the Linux thread was actually terminated by ThreadX is only + being allowed to run in order to cleanup its resources. */ + /* Unlock linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + pthread_exit((void *)&exit_code); + } + + /* Determine if the time-slice is active. */ + if (_tx_timer_time_slice) + { + + /* Preserve current remaining time-slice for the thread and clear the current time-slice. */ + temp_thread_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Save the run semaphore into a temporary variable as well. */ + temp_run_semaphore = &temp_thread_ptr -> tx_thread_linux_thread_run_semaphore; + + /* Pickup the current thread state. */ + temp_thread_state = temp_thread_ptr -> tx_thread_state; + + /* Setup the suspension type for this thread. */ + temp_thread_ptr -> tx_thread_linux_suspension_type = 0; + + /* Set the current thread pointer to NULL. */ + _tx_thread_current_ptr = TX_NULL; + + /* Unlock Linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN-release_sem", __FILE__, __LINE__); + + /* Make sure semaphore is 0. */ + while(!sem_trywait(&_tx_linux_semaphore)); + + /* Release the semaphore that the main scheduling thread is waiting + on. Note that the main scheduling algorithm will take care of + setting the current thread pointer to NULL. */ + tx_linux_sem_post(&_tx_linux_semaphore); + + /* Determine if the thread was self-terminating. */ + if (temp_thread_state == TX_TERMINATED) + { + + /* Exit the thread instead of waiting on the semaphore! */ + pthread_exit((void *)&exit_code); + } + + /* Wait on the run semaphore for this thread. This won't get set again + until the thread is scheduled. */ + tx_linux_sem_wait(temp_run_semaphore); + tx_linux_sem_post_nolock(&_tx_linux_semaphore); + + /* Lock Linux mutex. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN-wake_up", __FILE__, __LINE__); + + /* Determine if the thread was terminated. */ + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread and it does not + match the current thread pointer. */ + if ((_tx_linux_threadx_thread) && + ((!temp_thread_ptr) || (!pthread_equal(temp_thread_ptr -> tx_thread_linux_thread_id, thread_id)))) + { + + /* Unlock Linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + + /* This indicates the Linux thread was actually terminated by ThreadX and is only + being allowed to run in order to cleanup its resources. */ + pthread_exit((void *)&exit_code); + } + + /* Now determine if the application thread last had interrupts disabled. */ + + /* Determine if this thread had interrupts disabled. */ + if (!_tx_thread_current_ptr -> tx_thread_linux_int_disabled_flag) + { + + /* Unlock Linux mutex. */ + tx_linux_mutex_recursive_unlock(_tx_linux_mutex); + } + + /* Debug entry. */ + _tx_linux_debug_entry_insert("SYSTEM_RETURN-finish", __FILE__, __LINE__); +} + diff --git a/ports/linux/gnu/src/tx_timer_interrupt.c b/ports/linux/gnu/src/tx_timer_interrupt.c new file mode 100644 index 00000000..55207c14 --- /dev/null +++ b/ports/linux/gnu/src/tx_timer_interrupt.c @@ -0,0 +1,153 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_timer.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Linux/GNU */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_linux_debug_entry_insert */ +/* tx_linux_mutex_lock */ +/* tx_linux_mutex_unlock */ +/* _tx_timer_expiration_process */ +/* _tx_thread_time_slice */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_timer_interrupt(VOID) +{ + + /* Debug entry. */ + _tx_linux_debug_entry_insert("TIMER INTERRUPT", __FILE__, __LINE__); + + /* Lock mutex to ensure other threads are not playing with + the core ThreadX data structures. */ + tx_linux_mutex_lock(_tx_linux_mutex); + + /* Increment the system clock. */ + _tx_timer_system_clock++; + + /* Test for time-slice expiration. */ + if (_tx_timer_time_slice) + { + + /* Decrement the time_slice. */ + _tx_timer_time_slice--; + + /* Check for expiration. */ + if (_tx_timer_time_slice == 0) + { + + /* Set the time-slice expired flag. */ + _tx_timer_expired_time_slice = TX_TRUE; + } + } + + /* Test for timer expiration. */ + if (*_tx_timer_current_ptr) + { + + /* Set expiration flag. */ + _tx_timer_expired = TX_TRUE; + } + else + { + + /* No timer expired, increment the timer pointer. */ + _tx_timer_current_ptr++; + + /* Check for wrap-around. */ + if (_tx_timer_current_ptr == _tx_timer_list_end) + { + + /* Wrap to beginning of list. */ + _tx_timer_current_ptr = _tx_timer_list_start; + } + } + + /* See if anything has expired. */ + if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) + { + + /* Did a timer expire? */ + if (_tx_timer_expired) + { + + /* Process timer expiration. */ + _tx_timer_expiration_process(); + } + + /* Did time slice expire? */ + if (_tx_timer_expired_time_slice) + { + + /* Time slice interrupted thread. */ + _tx_thread_time_slice(); + } + } + + /* Unlock linux mutex. */ + tx_linux_mutex_unlock(_tx_linux_mutex); +} + diff --git a/ports/win32/vs_2019/example_build/azure_rtos.sln b/ports/win32/vs_2019/example_build/azure_rtos.sln new file mode 100644 index 00000000..fb6be8b5 --- /dev/null +++ b/ports/win32/vs_2019/example_build/azure_rtos.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30204.135 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sample_threadx", "sample_threadx\sample_threadx.vcxproj", "{7342DEEF-AB3F-00D5-9EDB-2829CD277B76}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tx", "tx\tx.vcxproj", "{51907112-62DA-98D6-7897-5A2FD48B99C3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + Template|Win32 = Template|Win32 + Template|x64 = Template|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Debug|Win32.ActiveCfg = Debug|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Debug|Win32.Build.0 = Debug|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Debug|x64.ActiveCfg = Debug|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Release|Win32.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Release|Win32.Build.0 = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Release|x64.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|Win32.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|Win32.Build.0 = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|x64.ActiveCfg = Release|Win32 + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76}.Template|x64.Build.0 = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Debug|Win32.ActiveCfg = Debug|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Debug|Win32.Build.0 = Debug|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Debug|x64.ActiveCfg = Debug|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Release|Win32.ActiveCfg = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Release|Win32.Build.0 = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Release|x64.ActiveCfg = Release|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Template|Win32.ActiveCfg = Template|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Template|Win32.Build.0 = Template|Win32 + {51907112-62DA-98D6-7897-5A2FD48B99C3}.Template|x64.ActiveCfg = Template|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FAE0BBF6-14F8-4320-AAB9-65E1361EB38A} + EndGlobalSection +EndGlobal diff --git a/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c new file mode 100644 index 00000000..46d2aff4 --- /dev/null +++ b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.c @@ -0,0 +1,381 @@ +/* This is a small demo of the high-performance ThreadX kernel. It includes examples of eight + threads of different priorities, using a message queue, semaphore, mutex, event flags group, + byte pool, and block pool. */ + +#include "tx_api.h" +#include + +#define DEMO_STACK_SIZE 1024 +#define DEMO_BYTE_POOL_SIZE 9120 +#define DEMO_BLOCK_POOL_SIZE 100 +#define DEMO_QUEUE_SIZE 100 + + +/* Define the ThreadX object control blocks... */ + +TX_THREAD thread_0; +TX_THREAD thread_1; +TX_THREAD thread_2; +TX_THREAD thread_3; +TX_THREAD thread_4; +TX_THREAD thread_5; +TX_THREAD thread_6; +TX_THREAD thread_7; +TX_QUEUE queue_0; +TX_SEMAPHORE semaphore_0; +TX_MUTEX mutex_0; +TX_EVENT_FLAGS_GROUP event_flags_0; +TX_BYTE_POOL byte_pool_0; +TX_BLOCK_POOL block_pool_0; + + +/* Define the counters used in the demo application... */ + +ULONG thread_0_counter; +ULONG thread_1_counter; +ULONG thread_1_messages_sent; +ULONG thread_2_counter; +ULONG thread_2_messages_received; +ULONG thread_3_counter; +ULONG thread_4_counter; +ULONG thread_5_counter; +ULONG thread_6_counter; +ULONG thread_7_counter; + + +/* Define thread prototypes. */ + +void thread_0_entry(ULONG thread_input); +void thread_1_entry(ULONG thread_input); +void thread_2_entry(ULONG thread_input); +void thread_3_and_4_entry(ULONG thread_input); +void thread_5_entry(ULONG thread_input); +void thread_6_and_7_entry(ULONG thread_input); + + +/* Define main entry point. */ + +int main() +{ + + /* Enter the ThreadX kernel. */ + tx_kernel_enter(); +} + + +/* Define what the initial system looks like. */ + +void tx_application_define(void *first_unused_memory) +{ + +CHAR *pointer = TX_NULL; + + + /* Create a byte memory pool from which to allocate the thread stacks. */ + tx_byte_pool_create(&byte_pool_0, "byte pool 0", first_unused_memory, DEMO_BYTE_POOL_SIZE); + + /* Put system definition stuff in here, e.g. thread creates and other assorted + create information. */ + + /* Allocate the stack for thread 0. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create the main thread. */ + tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0, + pointer, DEMO_STACK_SIZE, + 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); + + + /* Allocate the stack for thread 1. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 1 and 2. These threads pass information through a ThreadX + message queue. It is also interesting to note that these threads have a time + slice. */ + tx_thread_create(&thread_1, "thread 1", thread_1_entry, 1, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 2. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_2, "thread 2", thread_2_entry, 2, + pointer, DEMO_STACK_SIZE, + 16, 16, 4, TX_AUTO_START); + + /* Allocate the stack for thread 3. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 3 and 4. These threads compete for a ThreadX counting semaphore. + An interesting thing here is that both threads share the same instruction area. */ + tx_thread_create(&thread_3, "thread 3", thread_3_and_4_entry, 3, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 4. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_4, "thread 4", thread_3_and_4_entry, 4, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 5. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create thread 5. This thread simply pends on an event flag which will be set + by thread_0. */ + tx_thread_create(&thread_5, "thread 5", thread_5_entry, 5, + pointer, DEMO_STACK_SIZE, + 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 6. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + /* Create threads 6 and 7. These threads compete for a ThreadX mutex. */ + tx_thread_create(&thread_6, "thread 6", thread_6_and_7_entry, 6, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the stack for thread 7. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT); + + tx_thread_create(&thread_7, "thread 7", thread_6_and_7_entry, 7, + pointer, DEMO_STACK_SIZE, + 8, 8, TX_NO_TIME_SLICE, TX_AUTO_START); + + /* Allocate the message queue. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_QUEUE_SIZE*sizeof(ULONG), TX_NO_WAIT); + + /* Create the message queue shared by threads 1 and 2. */ + tx_queue_create(&queue_0, "queue 0", TX_1_ULONG, pointer, DEMO_QUEUE_SIZE*sizeof(ULONG)); + + /* Create the semaphore used by threads 3 and 4. */ + tx_semaphore_create(&semaphore_0, "semaphore 0", 1); + + /* Create the event flags group used by threads 1 and 5. */ + tx_event_flags_create(&event_flags_0, "event flags 0"); + + /* Create the mutex used by thread 6 and 7 without priority inheritance. */ + tx_mutex_create(&mutex_0, "mutex 0", TX_NO_INHERIT); + + /* Allocate the memory for a small block pool. */ + tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_BLOCK_POOL_SIZE, TX_NO_WAIT); + + /* Create a block memory pool to allocate a message buffer from. */ + tx_block_pool_create(&block_pool_0, "block pool 0", sizeof(ULONG), pointer, DEMO_BLOCK_POOL_SIZE); + + /* Allocate a block and release the block memory. */ + tx_block_allocate(&block_pool_0, (VOID **) &pointer, TX_NO_WAIT); + + /* Release the block back to the pool. */ + tx_block_release(pointer); +} + + + +/* Define the test threads. */ + +void thread_0_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sits in while-forever-sleep loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_0_counter++; + + /* Print results. */ + printf("**** ThreadX Win32 Demonstration **** (c) 1996-2020 Microsoft Corporation\n\n"); + printf(" thread 0 events sent: %lu\n", thread_0_counter); + printf(" thread 1 messages sent: %lu\n", thread_1_counter); + printf(" thread 2 messages received: %lu\n", thread_2_counter); + printf(" thread 3 obtained semaphore: %lu\n", thread_3_counter); + printf(" thread 4 obtained semaphore: %lu\n", thread_4_counter); + printf(" thread 5 events received: %lu\n", thread_5_counter); + printf(" thread 6 mutex obtained: %lu\n", thread_6_counter); + printf(" thread 7 mutex obtained: %lu\n\n", thread_7_counter); + + /* Sleep for 10 ticks. */ + tx_thread_sleep(10); + + /* Set event flag 0 to wakeup thread 5. */ + status = tx_event_flags_set(&event_flags_0, 0x1, TX_OR); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_1_entry(ULONG thread_input) +{ + +UINT status; + + + /* This thread simply sends messages to a queue shared by thread 2. */ + while(1) + { + + /* Increment the thread counter. */ + thread_1_counter++; + + /* Send message to queue 0. */ + status = tx_queue_send(&queue_0, &thread_1_messages_sent, TX_WAIT_FOREVER); + + /* Check completion status. */ + if (status != TX_SUCCESS) + break; + + /* Increment the message sent. */ + thread_1_messages_sent++; + } +} + + +void thread_2_entry(ULONG thread_input) +{ + +ULONG received_message; +UINT status; + + /* This thread retrieves messages placed on the queue by thread 1. */ + while(1) + { + + /* Increment the thread counter. */ + thread_2_counter++; + + /* Retrieve a message from the queue. */ + status = tx_queue_receive(&queue_0, &received_message, TX_WAIT_FOREVER); + + /* Check completion status and make sure the message is what we + expected. */ + if ((status != TX_SUCCESS) || (received_message != thread_2_messages_received)) + break; + + /* Otherwise, all is okay. Increment the received message count. */ + thread_2_messages_received++; + } +} + + +void thread_3_and_4_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 3 and thread 4. As the loop + below shows, these function compete for ownership of semaphore_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 3) + thread_3_counter++; + else + thread_4_counter++; + + /* Get the semaphore with suspension. */ + status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the semaphore. */ + tx_thread_sleep(2); + + /* Release the semaphore. */ + status = tx_semaphore_put(&semaphore_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} + + +void thread_5_entry(ULONG thread_input) +{ + +UINT status; +ULONG actual_flags; + + + /* This thread simply waits for an event in a forever loop. */ + while(1) + { + + /* Increment the thread counter. */ + thread_5_counter++; + + /* Wait for event flag 0. */ + status = tx_event_flags_get(&event_flags_0, 0x1, TX_OR_CLEAR, + &actual_flags, TX_WAIT_FOREVER); + + /* Check status. */ + if ((status != TX_SUCCESS) || (actual_flags != 0x1)) + break; + } +} + + +void thread_6_and_7_entry(ULONG thread_input) +{ + +UINT status; + + + /* This function is executed from thread 6 and thread 7. As the loop + below shows, these function compete for ownership of mutex_0. */ + while(1) + { + + /* Increment the thread counter. */ + if (thread_input == 6) + thread_6_counter++; + else + thread_7_counter++; + + /* Get the mutex with suspension. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Get the mutex again with suspension. This shows + that an owning thread may retrieve the mutex it + owns multiple times. */ + status = tx_mutex_get(&mutex_0, TX_WAIT_FOREVER); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Sleep for 2 ticks to hold the mutex. */ + tx_thread_sleep(2); + + /* Release the mutex. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + + /* Release the mutex again. This will actually + release ownership since it was obtained twice. */ + status = tx_mutex_put(&mutex_0); + + /* Check status. */ + if (status != TX_SUCCESS) + break; + } +} diff --git a/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj new file mode 100644 index 00000000..dbb6c98b --- /dev/null +++ b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + {7342DEEF-AB3F-00D5-9EDB-2829CD277B76} + 10.0 + + + + Application + false + MultiByte + v142 + + + Application + false + MultiByte + v142 + + + + + + + + + + + + + + + .\Debug\ + .\Debug\ + false + + + .\Release\ + .\Release\ + false + + + + MultiThreadedDebug + Default + true + Disabled + true + Level3 + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + .\Debug\ + .\Debug\sample_threadx.pch + .\Debug\ + .\Debug\ + EnableFastChecks + ..\..\inc;..\..\..\..\..\common\inc + false + false + + + .\Debug\sample_threadx.tlb + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\sample_threadx.bsc + + + true + true + Console + .\Debug\sample_threadx.exe + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + MultiThreaded + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + .\Release\ + .\Release\sample_threadx.pch + .\Release\ + .\Release\ + ../../../generic + false + + + .\Release\sample_threadx.tlb + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\sample_threadx.bsc + + + true + Console + .\Release\sample_threadx.exe + odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters new file mode 100644 index 00000000..457cd446 --- /dev/null +++ b/ports/win32/vs_2019/example_build/sample_threadx/sample_threadx.vcxproj.filters @@ -0,0 +1,29 @@ + + + + + {6006269e-f4d4-4e46-be11-4a87e3703f4b} + h;hpp;hxx;hm;inl + + + {92d04b48-db8b-4511-a4fd-305688bda3d5} + cpp;c;cxx;rc;def;r;odl;idl;hpj;bat + + + + + inc + + + inc + + + + + src + + + + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/example_build/tx/tx.vcxproj b/ports/win32/vs_2019/example_build/tx/tx.vcxproj new file mode 100644 index 00000000..827ae65e --- /dev/null +++ b/ports/win32/vs_2019/example_build/tx/tx.vcxproj @@ -0,0 +1,339 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Template + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {51907112-62DA-98D6-7897-5A2FD48B99C3} + 10.0 + + + + Application + v142 + + + StaticLibrary + false + MultiByte + v142 + + + StaticLibrary + false + MultiByte + v142 + + + + + + + + + + + + + + + + + + .\Release\ + .\Release\ + + + .\Debug\ + .\Debug\ + + + + MultiThreaded + OnlyExplicitInline + true + true + MaxSpeed + true + Level3 + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + .\Release\ + .\Release\tx.pch + .\Release\ + .\Release\ + ..\;..\..\..\generic + None + false + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\tx.bsc + + + true + .\Release\tx.lib + + + + + MultiThreadedDebug + Default + true + Disabled + true + Level3 + ProgramDatabase + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + .\Debug\ + .\Debug\tx.pch + .\Debug\ + .\Debug\ + EnableFastChecks + ..\..\inc;..\..\..\..\..\common\inc + false + true + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\Debug\tx.bsc + + + true + .\Debug\tx.lib + + + + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters b/ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters new file mode 100644 index 00000000..303c5d5f --- /dev/null +++ b/ports/win32/vs_2019/example_build/tx/tx.vcxproj.filters @@ -0,0 +1,633 @@ + + + + + {096c4605-3053-4040-8f19-1e6fedb9568e} + + + {3786c84c-e250-4a5c-b0a0-2a1d2c8979e3} + + + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + inc + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + \ No newline at end of file diff --git a/ports/win32/vs_2019/inc/tx_port.h b/ports/win32/vs_2019/inc/tx_port.h new file mode 100644 index 00000000..c5f666f8 --- /dev/null +++ b/ports/win32/vs_2019/inc/tx_port.h @@ -0,0 +1,453 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Port Specific */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +/**************************************************************************/ +/* */ +/* PORT SPECIFIC C INFORMATION RELEASE */ +/* */ +/* tx_port.h Win32/Visual */ +/* 6.0.1 */ +/* */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This file contains data type definitions that make the ThreadX */ +/* real-time kernel function identically on a variety of different */ +/* processor architectures. For example, the size or number of bits */ +/* in an "int" data type vary between microprocessor architectures and */ +/* even C compilers for the same microprocessor. ThreadX does not */ +/* directly use native C data types. Instead, ThreadX creates its */ +/* own special types that can be mapped to actual data types by this */ +/* file to guarantee consistency in the interface and functionality. */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ + +#ifndef TX_PORT_H +#define TX_PORT_H + + +/* Determine if the optional ThreadX user define file should be used. */ + +#ifdef TX_INCLUDE_USER_DEFINE_FILE + + +/* Yes, include the user defines in tx_user.h. The defines in this file may + alternately be defined on the command line. */ + +#include "tx_user.h" +#endif + + +/* Define compiler library include files. */ + +#include +#include + + +/* Define performance metric symbols. */ + +#ifndef TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO +#define TX_BLOCK_POOL_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO +#define TX_BYTE_POOL_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO +#define TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_MUTEX_ENABLE_PERFORMANCE_INFO +#define TX_MUTEX_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_QUEUE_ENABLE_PERFORMANCE_INFO +#define TX_QUEUE_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO +#define TX_SEMAPHORE_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_THREAD_ENABLE_PERFORMANCE_INFO +#define TX_THREAD_ENABLE_PERFORMANCE_INFO +#endif + +#ifndef TX_TIMER_ENABLE_PERFORMANCE_INFO +#define TX_TIMER_ENABLE_PERFORMANCE_INFO +#endif + + +/* Enable trace info. */ + +#ifndef TX_ENABLE_EVENT_TRACE +#define TX_ENABLE_EVENT_TRACE +#endif + + +/* Define ThreadX basic types for this port. */ + +#define VOID void +typedef char CHAR; +typedef unsigned char UCHAR; +typedef int INT; +typedef unsigned int UINT; +typedef long LONG; +typedef unsigned long ULONG; +typedef short SHORT; +typedef unsigned short USHORT; + + +/* Add Win32 debug insert prototype. */ + +void _tx_win32_debug_entry_insert(char *action, char *file, unsigned long line); + +#ifndef TX_WIN32_DEBUG_ENABLE + +/* If Win32 debug is not enabled, turn logging into white-space. */ + +#define _tx_win32_debug_entry_insert(a, b, c) + +#endif + + + +/* Define the TX_MEMSET macro to remove library reference. */ + +#define TX_MEMSET(a,b,c) { \ + UCHAR *ptr; \ + UCHAR value; \ + UINT i, size; \ + ptr = (UCHAR *) ((VOID *) a); \ + value = (UCHAR) b; \ + size = (UINT) c; \ + for (i = 0; i < size; i++) \ + { \ + *ptr++ = value; \ + } \ + } + + +/* Include windows include file. */ + +#include + + +/* Define the priority levels for ThreadX. Legal values range + from 32 to 1024 and MUST be evenly divisible by 32. */ + +#ifndef TX_MAX_PRIORITIES +#define TX_MAX_PRIORITIES 32 +#endif + + +/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during + thread creation is less than this value, the thread create call will return an error. */ + +#ifndef TX_MINIMUM_STACK +#define TX_MINIMUM_STACK 200 /* Minimum stack size for this port */ +#endif + + +/* Define the system timer thread's default stack size and priority. These are only applicable + if TX_TIMER_PROCESS_IN_ISR is not defined. */ + +#ifndef TX_TIMER_THREAD_STACK_SIZE +#define TX_TIMER_THREAD_STACK_SIZE 400 /* Default timer thread stack size - Not used in Win32 port! */ +#endif + +#ifndef TX_TIMER_THREAD_PRIORITY +#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */ +#endif + + +/* Define various constants for the ThreadX port. */ + +#define TX_INT_DISABLE 1 /* Disable interrupts */ +#define TX_INT_ENABLE 0 /* Enable interrupts */ + + +/* Define the clock source for trace event entry time stamp. The following two item are port specific. + For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock + source constants would be: + +#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024) +#define TX_TRACE_TIME_MASK 0x0000FFFFUL + +*/ + +#ifndef TX_TRACE_TIME_SOURCE +#define TX_TRACE_TIME_SOURCE ((ULONG) (_tx_win32_time_stamp.LowPart)); +#endif +#ifndef TX_TRACE_TIME_MASK +#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL +#endif + + +/* Define the port-specific trace extension to pickup the Windows timer. */ + +#define TX_TRACE_PORT_EXTENSION QueryPerformanceCounter((LARGE_INTEGER *)&_tx_win32_time_stamp); + + +/* Define the port specific options for the _tx_build_options variable. This variable indicates + how the ThreadX library was built. */ + +#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0 + + +/* Define the in-line initialization constant so that modules with in-line + initialization capabilities can prevent their initialization from being + a function call. */ + +#define TX_INLINE_INITIALIZATION + + +/* Define the Win32-specific initialization code that is expanded in the generic source. */ + +void _tx_initialize_start_interrupts(void); + +#define TX_PORT_SPECIFIC_PRE_SCHEDULER_INITIALIZATION _tx_initialize_start_interrupts(); + + +/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is + disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack + checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING + define is negated, thereby forcing the stack fill which is necessary for the stack checking + logic. */ + +#ifdef TX_ENABLE_STACK_CHECKING +#undef TX_DISABLE_STACK_FILLING +#endif + + +/* Define the TX_THREAD control block extensions for this port. The main reason + for the multiple macros is so that backward compatibility can be maintained with + existing ThreadX kernel awareness modules. */ + +#define TX_THREAD_EXTENSION_0 HANDLE tx_thread_win32_thread_handle; \ + DWORD tx_thread_win32_thread_id; \ + HANDLE tx_thread_win32_thread_run_semaphore; \ + UINT tx_thread_win32_suspension_type; \ + UINT tx_thread_win32_int_disabled_flag; +#define TX_THREAD_EXTENSION_1 +#define TX_THREAD_EXTENSION_2 +#define TX_THREAD_EXTENSION_3 + + +/* Define the port extensions of the remaining ThreadX objects. */ + +#define TX_BLOCK_POOL_EXTENSION +#define TX_BYTE_POOL_EXTENSION +#define TX_EVENT_FLAGS_GROUP_EXTENSION +#define TX_MUTEX_EXTENSION +#define TX_QUEUE_EXTENSION +#define TX_SEMAPHORE_EXTENSION +#define TX_TIMER_EXTENSION + + +/* Define the user extension field of the thread control block. Nothing + additional is needed for this port so it is defined as white space. */ + +#ifndef TX_THREAD_USER_EXTENSION +#define TX_THREAD_USER_EXTENSION +#endif + + +/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete, + tx_thread_shell_entry, and tx_thread_terminate. */ + + +#define TX_THREAD_CREATE_EXTENSION(thread_ptr) +#define TX_THREAD_DELETE_EXTENSION(thread_ptr) +#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr) +#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr) + + +/* Define the ThreadX object creation extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr) +#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr) +#define TX_QUEUE_CREATE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr) +#define TX_TIMER_CREATE_EXTENSION(timer_ptr) + + +/* Define the ThreadX object deletion extensions for the remaining objects. */ + +#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr) +#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr) +#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr) +#define TX_QUEUE_DELETE_EXTENSION(queue_ptr) +#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr) +#define TX_TIMER_DELETE_EXTENSION(timer_ptr) + + +struct TX_THREAD_STRUCT; + +/* Define the Win32 critical section data structure. */ + +typedef struct TX_WIN32_CRITICAL_SECTION_STRUCT +{ + HANDLE tx_win32_critical_section_mutex_handle; + DWORD tx_win32_critical_section_owner; + ULONG tx_win32_critical_section_nested_count; +} TX_WIN32_CRITICAL_SECTION; + + +/* Define Win32-specific critical section APIs. */ + +void _tx_win32_critical_section_obtain(TX_WIN32_CRITICAL_SECTION *critical_section); +void _tx_win32_critical_section_release(TX_WIN32_CRITICAL_SECTION *critical_section); +void _tx_win32_critical_section_release_all(TX_WIN32_CRITICAL_SECTION *critical_section); + + +/* Define post completion processing for tx_thread_delete, so that the Win32 thread resources are properly removed. */ + +#define TX_THREAD_DELETE_PORT_COMPLETION(thread_ptr) \ +{ \ +BOOL win32_status; \ +DWORD exitcode; \ +HANDLE threadrunsemaphore; \ +HANDLE threadhandle; \ + threadhandle = thread_ptr -> tx_thread_win32_thread_handle; \ + threadrunsemaphore = thread_ptr -> tx_thread_win32_thread_run_semaphore; \ + _tx_thread_interrupt_restore(tx_saved_posture); \ + do \ + { \ + win32_status = GetExitCodeThread(threadhandle, &exitcode); \ + if ((win32_status) && (exitcode != STILL_ACTIVE)) \ + { \ + break; \ + } \ + ResumeThread(threadhandle); \ + ReleaseSemaphore(threadrunsemaphore, 1, NULL); \ + Sleep(1); \ + } while (1); \ + CloseHandle(threadhandle); \ + tx_saved_posture = _tx_thread_interrupt_disable(); \ +} + + +/* Define post completion processing for tx_thread_reset, so that the Win32 thread resources are properly removed. */ + +#define TX_THREAD_RESET_PORT_COMPLETION(thread_ptr) \ +{ \ +BOOL win32_status; \ +DWORD exitcode; \ +HANDLE threadrunsemaphore; \ +HANDLE threadhandle; \ + threadhandle = thread_ptr -> tx_thread_win32_thread_handle; \ + threadrunsemaphore = thread_ptr -> tx_thread_win32_thread_run_semaphore; \ + _tx_thread_interrupt_restore(tx_saved_posture); \ + do \ + { \ + win32_status = GetExitCodeThread(threadhandle, &exitcode); \ + if ((win32_status) && (exitcode != STILL_ACTIVE)) \ + { \ + break; \ + } \ + ResumeThread(threadhandle); \ + ReleaseSemaphore(threadrunsemaphore, 1, NULL); \ + Sleep(1); \ + } while (1); \ + CloseHandle(threadhandle); \ + tx_saved_posture = _tx_thread_interrupt_disable(); \ +} + + +/* Define ThreadX interrupt lockout and restore macros for protection on + access of critical kernel information. The restore interrupt macro must + restore the interrupt posture of the running thread prior to the value + present prior to the disable macro. In most cases, the save area macro + is used to define a local function save area for the disable and restore + macros. */ + +UINT _tx_thread_interrupt_disable(void); +VOID _tx_thread_interrupt_restore(UINT previous_posture); + +#define TX_INTERRUPT_SAVE_AREA UINT tx_saved_posture; + +#define TX_DISABLE tx_saved_posture = _tx_thread_interrupt_disable(); + +#define TX_RESTORE _tx_thread_interrupt_restore(tx_saved_posture); + + +/* Define the interrupt lockout macros for each ThreadX object. */ + +#define TX_BLOCK_POOL_DISABLE TX_DISABLE +#define TX_BYTE_POOL_DISABLE TX_DISABLE +#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE +#define TX_MUTEX_DISABLE TX_DISABLE +#define TX_QUEUE_DISABLE TX_DISABLE +#define TX_SEMAPHORE_DISABLE TX_DISABLE + + +/* Define the version ID of ThreadX. This may be utilized by the application. */ + +#ifdef TX_THREAD_INIT +CHAR _tx_version_id[] = + "Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Win32/Visual Studio Version 6.0 *"; +#else +extern CHAR _tx_version_id[]; +#endif + + +/* Define externals for the Win32 port of ThreadX. */ + +extern TX_WIN32_CRITICAL_SECTION _tx_win32_critical_section; +extern HANDLE _tx_win32_scheduler_semaphore; +extern DWORD _tx_win32_scheduler_id; +extern ULONG _tx_win32_global_int_disabled_flag; +extern LARGE_INTEGER _tx_win32_time_stamp; +extern ULONG _tx_win32_system_error; +extern HANDLE _tx_win32_timer_handle; +extern DWORD _tx_win32_timer_id; +extern LARGE_INTEGER _tx_win32_time_stamp; + + +#ifndef TX_WIN32_MEMORY_SIZE +#define TX_WIN32_MEMORY_SIZE 64000 +#endif + +#ifndef TX_TIMER_PERIODIC +#define TX_TIMER_PERIODIC 18 +#endif + +#endif + + + + diff --git a/ports/win32/vs_2019/readme_threadx.txt b/ports/win32/vs_2019/readme_threadx.txt new file mode 100644 index 00000000..348d1a37 --- /dev/null +++ b/ports/win32/vs_2019/readme_threadx.txt @@ -0,0 +1,155 @@ + Microsoft's Azure RTOS ThreadX for Win32 + + Using the Visual Studio Tools + + +1. Open the ThreadX Project Workspace + +In order to build the ThreadX library and the ThreadX demonstration first load +the Azure RTOS Workspace azure_rtos.sln, which is located inside the "example_build" +directory. + + +2. Building the ThreadX run-time Library + +Building the ThreadX library is easy; simply make the "tx" project active and +then select the build button. You should now observe the compilation of the +ThreadX library source. This project build produces the ThreadX library file +tx.lib. + + +3. Building the Demonstration System + +You are now ready to run the ThreadX Win32 demonstration. Simply make the +"sample_thread" project active and then select the build button. When the build +is finished, select the run button from Visual Studio and observe various +demonstration statistics being printed to the console window. You may also set +breakpoints, single step, perform data watches, etc. + + +4. System Initialization + +The system entry point is at main(), which is defined in the application. +Once the application calls tx_kernel_enter, ThreadX starts running and +performs various initialization duties prior to starting the scheduler. The +Win32-specific initialization is done in the function _tx_initialize_low_level, +which is located in the file tx_initialize_low_level.c. This function is +responsible for setting up various system data structures and simulated +interrupts - including the periodic timer interrupt source for ThreadX. + +In addition, _tx_initialize_low_level determines the first available +address for use by the application. In Win32, this is basically done +by using malloc to get a big block of memory from Windows. + + +5. Win32 Implementation + +ThreadX for Win32 is implemented using Win32 threads. Each application +thread in ThreadX actually runs as a Win32 thread. The determination of +which application thread to run is made by the ThreadX scheduler, which +itself is a Win32 thread. The ThreadX scheduler is the highest priority +thread in the system. + +Interrupts in ThreadX/Win32 are also simulated by threads. A good example +is the ThreadX system timer interrupt, which can be found in +tx_initialize_low_level.c. + +5.1 ThreadX Limitations + +ThreadX for Win32 behaves in the same manner as ThreadX in an embedded +environment EXCEPT in the case of thread termination. Unfortunately, the +Win32 API does not have a good mechanism to terminate threads and instead +must rely on the thread itself terminating. Hence, threads in the ThreadX +Win32 implementation must have some ThreadX call periodically in their +processing if they can be terminated by another ThreadX thread. + + +6. Improving Performance + +The distribution version of ThreadX is built without any compiler +optimizations. This makes it easy to debug because you can trace or set +breakpoints inside of ThreadX itself. Of course, this costs some +performance. To make it run faster, you can change the tx project file to +enable all compiler optimizations. In addition, you can eliminate the +ThreadX basic API error checking by compiling your application code with the +symbol TX_DISABLE_ERROR_CHECKING defined. + + +7. Interrupt Handling + +ThreadX provides simulated interrupt handling with Win32 threads. Simulated +interrupt threads may be created by the application or may be added to the +simulated timer interrupt defined in tx_initialize_low_level.c. The following +format for creating simulated interrupts should be used: + +7.1 Data structures + +Here is an example of how to define the Win32 data structures and prototypes +necessary to create a simulated interrupt thread: + +HANDLE _sample_win32_interrupt_handle; +DWORD _sample_win32_interrupt_id; +DWORD WINAPI _sample_win32_interrupt(LPVOID); + + +7.2 Creating a Simulated Interrupt Thread + +Here is an example of how to create a simulated interrupt thread in Win32. +This may be done inside of tx_initialize_low_level.c or from your application code + + _sample_win32_interrupt_handle = + CreateThread(NULL, 0, _sample_win32_interrupt, (LPVOID) &_sample_win32_interrupt_handle, + CREATE_SUSPENDED, &_sample_win32_interrupt_id); + + SetThreadPriority(_sample_win32_interrupt_handle, THREAD_PRIORITY_BELOW_NORMAL); + + +7.3 Activating the Simulated Interrupt Thread + +Simulated interrupt threads should not be activated until initialization is complete, i.e. until +ThreadX is ready to schedule threads. The following activation code may be added to the routine +in tx_initialize_low_level.c called _tx_initialize_start_interrupts or into the application code directly: + + ResumeThread(_sample_win32_interrupt_handle); + + +7.4 Simulated Interrupt Thread Template + +The following is a template for the simulated interrupt thread. This interrupt will occur on +a periodic basis. + +DWORD WINAPI _sample_win32_interrupt(LPVOID *ptr) +{ + + + while(1) + { + + /* Sleep for the desired time. */ + Sleep(18); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + /* Call application ISR here! */ + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + } +} + + +8. Revision History + +For generic code revision information, please refer to the readme_threadx_generic.txt +file, which is included in your distribution. The following details the revision +information associated with this specific port of ThreadX: + +06/30/2020 Initial ThreadX version for Win32 using Microsoft Visual C/C++. + + +Copyright(c) 1996-2020 Microsoft Corporation + + +https://azure.com/rtos + diff --git a/ports/win32/vs_2019/src/tx_initialize_low_level.c b/ports/win32/vs_2019/src/tx_initialize_low_level.c new file mode 100644 index 00000000..f11df9dc --- /dev/null +++ b/ports/win32/vs_2019/src/tx_initialize_low_level.c @@ -0,0 +1,307 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Initialize */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include +#include +#include + + +/* Define various Win32 objects used by the ThreadX port. */ + +TX_WIN32_CRITICAL_SECTION _tx_win32_critical_section; +HANDLE _tx_win32_scheduler_semaphore; +DWORD _tx_win32_scheduler_id; +ULONG _tx_win32_global_int_disabled_flag; +LARGE_INTEGER _tx_win32_time_stamp; +ULONG _tx_win32_system_error; +extern TX_THREAD *_tx_thread_current_ptr; + + +/* Define simulated timer interrupt. This is done inside a thread, which is + how other interrupts may be defined as well. See code below for an + example. */ + +HANDLE _tx_win32_timer_handle; +DWORD _tx_win32_timer_id; +DWORD WINAPI _tx_win32_timer_interrupt(LPVOID p); + + +#ifdef TX_WIN32_DEBUG_ENABLE + +extern ULONG _tx_thread_system_state; +extern UINT _tx_thread_preempt_disable; +extern TX_THREAD *_tx_thread_current_ptr; +extern TX_THREAD *_tx_thread_execute_ptr; + + +/* Define the maximum size of the Win32 debug array. */ + +#ifndef TX_WIN32_DEBUG_EVENT_SIZE +#define TX_WIN32_DEBUG_EVENT_SIZE 400 +#endif + + +/* Define debug log in order to debug Win32 issues with this port. */ + +typedef struct TX_WIN32_DEBUG_ENTRY_STRUCT +{ + char *tx_win32_debug_entry_action; + LARGE_INTEGER tx_win32_debug_entry_timestamp; + char *tx_win32_debug_entry_file; + unsigned long tx_win32_debug_entry_line; + TX_WIN32_CRITICAL_SECTION tx_win32_debug_entry_critical_section; + unsigned long tx_win32_debug_entry_int_disabled_flag; + ULONG tx_win32_debug_entry_system_state; + UINT tx_win32_debug_entry_preempt_disable; + TX_THREAD *tx_win32_debug_entry_current_thread; + DWORD tx_win32_debug_entry_current_thread_id; + TX_THREAD *tx_win32_debug_entry_execute_thread; + DWORD tx_win32_debug_entry_execute_thread_id; + DWORD tx_win32_debug_entry_running_id; +} TX_WIN32_DEBUG_ENTRY; + + +/* Define the circular array of Win32 debug entries. */ + +TX_WIN32_DEBUG_ENTRY _tx_win32_debug_entry_array[TX_WIN32_DEBUG_EVENT_SIZE]; + + +/* Define the Win32 debug index. */ + +unsigned long _tx_win32_debug_entry_index = 0; + + +/* Now define the debug entry function. */ +void _tx_win32_debug_entry_insert(char *action, char *file, unsigned long line) +{ + + + /* Get the time stamp. */ + QueryPerformanceCounter((LARGE_INTEGER *)&_tx_win32_time_stamp); + + /* Setup the debug entry. */ + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_action = action; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_timestamp = _tx_win32_time_stamp; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_file = file; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_line = line; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_critical_section = _tx_win32_critical_section; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_int_disabled_flag = _tx_win32_global_int_disabled_flag; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_system_state = _tx_thread_system_state; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_preempt_disable = _tx_thread_preempt_disable; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_current_thread = _tx_thread_current_ptr; + if (_tx_thread_current_ptr) + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_current_thread_id = _tx_thread_current_ptr -> tx_thread_win32_thread_id; + else + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_current_thread_id = 0; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_execute_thread = _tx_thread_execute_ptr; + if (_tx_thread_execute_ptr) + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_execute_thread_id = _tx_thread_execute_ptr -> tx_thread_win32_thread_id; + else + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_execute_thread_id = 0; + _tx_win32_debug_entry_array[_tx_win32_debug_entry_index].tx_win32_debug_entry_running_id = GetCurrentThreadId(); + + /* Now move to the next entry. */ + _tx_win32_debug_entry_index++; + + /* Determine if we need to wrap the list. */ + if (_tx_win32_debug_entry_index >= TX_WIN32_DEBUG_EVENT_SIZE) + { + + /* Yes, wrap the list! */ + _tx_win32_debug_entry_index = 0; + } +} + +#endif + + +/* Define the ThreadX timer interrupt handler. */ + +void _tx_timer_interrupt(void); + + +/* Define other external function references. */ + +VOID _tx_initialize_low_level(VOID); +VOID _tx_thread_context_save(VOID); +VOID _tx_thread_context_restore(VOID); + + +/* Define other external variable references. */ + +extern VOID *_tx_initialize_unused_memory; + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_initialize_low_level Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for any low-level processor */ +/* initialization, including setting up interrupt vectors, setting */ +/* up a periodic timer interrupt source, saving the system stack */ +/* pointer for use in ISR processing later, and finding the first */ +/* available RAM memory address for tx_application_define. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* CreateMutex Win32 create mutex */ +/* CreateThread Win32 create thread */ +/* CreateSemaphore Win32 create semaphore */ +/* GetCurrentThreadId Win32 get current thread ID */ +/* SetProcessAffinityMask Win32 process affinity set */ +/* SetThreadPriority Win32 set thread priority */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_initialize_low_level(VOID) +{ + +/* Deprecate TX_WIN32_MULTI_CORE build option and default to restricting + execution to one core. */ + +#ifndef TX_WIN32_BYPASS_AFFINITY_SETUP + + /* Limit this ThreadX simulation on Win32 to a single core. */ + if (SetProcessAffinityMask( GetCurrentProcess(), 1 ) == 0) + { + + /* Error restricting the process to one core. */ + printf("ThreadX Win32 error restricting the process to one core!\n"); + while(1) + { + } + } +#endif + + /* Pickup the first available memory address. */ + + /* Save the first available memory address. */ + _tx_initialize_unused_memory = malloc(TX_WIN32_MEMORY_SIZE); + + /* Pickup the unique Id of the current thread, which will also be the Id of the scheduler. */ + _tx_win32_scheduler_id = GetCurrentThreadId(); + + /* Create the system critical section mutex. This is used by the system to block all other access, + analogous to an interrupt lockout on an embedded target. */ + _tx_win32_critical_section.tx_win32_critical_section_mutex_handle = CreateMutex(NULL, FALSE, NULL); + _tx_win32_critical_section.tx_win32_critical_section_nested_count = 0; + _tx_win32_critical_section.tx_win32_critical_section_owner = 0; + + /* Create the semaphore that regulates when the scheduler executes. */ + _tx_win32_scheduler_semaphore = CreateSemaphore(NULL, 0, 1, NULL); + + /* Initialize the global interrupt disabled flag. */ + _tx_win32_global_int_disabled_flag = TX_FALSE; + + /* Setup periodic timer interrupt. */ + _tx_win32_timer_handle = + CreateThread(NULL, 0, _tx_win32_timer_interrupt, (LPVOID) &_tx_win32_timer_handle,CREATE_SUSPENDED, &_tx_win32_timer_id); + + /* Check for a good thread create. */ + if (!_tx_win32_timer_handle) + { + + /* Error creating the timer interrupt. */ + printf("ThreadX Win32 error creating timer interrupt thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. Now set the priority to + a level lower than the system thread but higher than the application + threads. */ + SetThreadPriority(_tx_win32_timer_handle, THREAD_PRIORITY_BELOW_NORMAL); + + /* Done, return to caller. */ +} + + +/* This routine is called after initialization is complete in order to start + all interrupt threads. Interrupt threads in addition to the timer may + be added to this routine as well. */ + +void _tx_initialize_start_interrupts(void) +{ + + /* Kick the timer thread off to generate the ThreadX periodic interrupt + source. */ + ResumeThread(_tx_win32_timer_handle); +} + + +/* Define the ThreadX system timer interrupt. Other interrupts may be simulated + in a similar way. */ + + +DWORD WINAPI _tx_win32_timer_interrupt(LPVOID p) +{ + + while(1) + { + + /* Sleep for the desired time. */ + Sleep(TX_TIMER_PERIODIC); + + /* Call ThreadX context save for interrupt preparation. */ + _tx_thread_context_save(); + + + /* Call the ThreadX system timer interrupt processing. */ + _tx_timer_interrupt(); + + /* Call ThreadX context restore for interrupt completion. */ + _tx_thread_context_restore(); + } +} diff --git a/ports/win32/vs_2019/src/tx_thread_context_restore.c b/ports/win32/vs_2019/src/tx_thread_context_restore.c new file mode 100644 index 00000000..8ff1ef23 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_context_restore.c @@ -0,0 +1,132 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_restore Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function restores the interrupt context if it is processing a */ +/* nested interrupt. If not, it returns to the interrupt thread if no */ +/* preemption is necessary. Otherwise, if preemption is necessary or */ +/* if no thread was running, the function returns to the scheduler. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* ReleaseSemaphore Win32 release semaphore */ +/* ResumeThread Win32 resume thread */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs Interrupt Service Routines */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_restore(VOID) +{ + + /* Enter critical section to ensure other threads are not playing with + the core ThreadX data structures. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("CONTEXT_RESTORE", __FILE__, __LINE__); + + /* Decrement the nested interrupt count. */ + _tx_thread_system_state--; + + /* Determine if this is the first nested interrupt and if a ThreadX + application thread was running at the time. */ + if ((!_tx_thread_system_state) && (_tx_thread_current_ptr)) + { + + /* Yes, this is the first and last interrupt processed. */ + + /* Check to see if preemption is required. */ + if ((_tx_thread_preempt_disable == 0) && (_tx_thread_current_ptr != _tx_thread_execute_ptr)) + { + + /* Preempt the running application thread. We don't need to suspend the + application thread since that is done in the context save processing. */ + + /* Indicate that this thread was suspended asynchronously. */ + _tx_thread_current_ptr -> tx_thread_win32_suspension_type = 1; + + /* Save the remaining time-slice and disable it. */ + if (_tx_timer_time_slice) + { + + _tx_thread_current_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Clear the current thread pointer. */ + _tx_thread_current_ptr = TX_NULL; + + /* Wakeup the system thread by setting the system semaphore. */ + ReleaseSemaphore(_tx_win32_scheduler_semaphore, 1, NULL); + } + else + { + + /* Since preemption is not required, resume the interrupted thread. */ + ResumeThread(_tx_thread_current_ptr -> tx_thread_win32_thread_handle); + } + } + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); +} + diff --git a/ports/win32/vs_2019/src/tx_thread_context_save.c b/ports/win32/vs_2019/src/tx_thread_context_save.c new file mode 100644 index 00000000..676c2832 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_context_save.c @@ -0,0 +1,113 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_context_save Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function saves the context of an executing thread in the */ +/* beginning of interrupt processing. The function also ensures that */ +/* the system stack is used upon return to the calling ISR. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* SuspendThread Win32 thread suspend */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* ISRs */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_context_save(VOID) +{ + +TX_THREAD *thread_ptr; + + + /* Enter critical section to ensure other threads are not playing with + the core ThreadX data structures. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("CONTEXT_SAVE", __FILE__, __LINE__); + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* If an application thread is running, suspend it to simulate preemption. */ + if ((thread_ptr) && (_tx_thread_system_state == 0)) + { + + /* Yes, this is the first interrupt and an application thread is running... + suspend it! */ + + /* Suspend the thread to simulate preemption. Note that the thread is suspended BEFORE the protection get + flag is checked to ensure there is not a race condition between this thread and the update of that flag. */ + SuspendThread(thread_ptr -> tx_thread_win32_thread_handle); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("CONTEXT_SAVE-suspend_thread", __FILE__, __LINE__); + + } + + /* Increment the nested interrupt condition. */ + _tx_thread_system_state++; + + /* Exit Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); +} + diff --git a/ports/win32/vs_2019/src/tx_thread_interrupt_control.c b/ports/win32/vs_2019/src/tx_thread_interrupt_control.c new file mode 100644 index 00000000..671758a1 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_interrupt_control.c @@ -0,0 +1,213 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" + +#include + +/* Define small routines used for the TX_DISABLE/TX_RESTORE macros. */ + +UINT _tx_thread_interrupt_disable(void) +{ + +UINT previous_value; + + + previous_value = _tx_thread_interrupt_control(TX_INT_DISABLE); + return(previous_value); +} + + +VOID _tx_thread_interrupt_restore(UINT previous_posture) +{ + + previous_posture = _tx_thread_interrupt_control(previous_posture); +} + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_interrupt_control Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is responsible for changing the interrupt lockout */ +/* posture of the system. */ +/* */ +/* INPUT */ +/* */ +/* new_posture New interrupt lockout posture */ +/* */ +/* OUTPUT */ +/* */ +/* old_posture Old interrupt lockout posture */ +/* */ +/* CALLS */ +/* */ +/* ExitThread Win32 thread exit */ +/* GetCurrentThread Win32 get current thread */ +/* GetCurrentThreadId Win32 get current thread ID */ +/* GetThreadPriority Win32 get thread priority */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* _tx_win32_critical_section_release_all */ +/* Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* Application Code */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +UINT _tx_thread_interrupt_control(UINT new_posture) +{ + +UINT old_posture; +HANDLE threadhandle; +int threadpriority; +DWORD threadid; +TX_THREAD *thread_ptr; + + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + +#ifdef TX_WIN32_DEBUG_ENABLE + + /* Determine if this is a disable or enable request. */ + if (new_posture == TX_INT_ENABLE) + { + /* Enable. */ + _tx_win32_debug_entry_insert("RESTORE", __FILE__, __LINE__); + } + else + { + /* Disable. */ + _tx_win32_debug_entry_insert("DISABLE", __FILE__, __LINE__); + } +#endif + + /* Determine if the thread was terminated. */ + + /* Pickup the handle of the current thread. */ + threadhandle = GetCurrentThread(); + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* Pickup the priority of the current thread. */ + threadpriority = GetThreadPriority(threadhandle); + + /* Pickup the ID of the current thread. */ + threadid = GetCurrentThreadId(); + + /* Determine if this is a thread (THREAD_PRIORITY_LOWEST) and it does not + match the current thread pointer. */ + if ((threadpriority == THREAD_PRIORITY_LOWEST) && + ((!thread_ptr) || (thread_ptr -> tx_thread_win32_thread_id != threadid))) + { + + /* This indicates the Win32 thread was actually terminated by ThreadX is only + being allowed to run in order to cleanup its resources. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* Exit this thread. */ + ExitThread(0); + } + + /* Determine the current interrupt lockout condition. */ + if (_tx_win32_critical_section.tx_win32_critical_section_nested_count == 1) + { + + /* First pass through, interrupts are enabled. */ + old_posture = TX_INT_ENABLE; + } + else + { + + /* Interrupts are disabled. */ + old_posture = TX_INT_DISABLE; + } + + /* First, determine if this call is from a non-thread. */ + if (_tx_thread_system_state) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_win32_global_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_win32_global_int_disabled_flag = TX_TRUE; + } + } + else if (thread_ptr) + { + + /* Determine how to apply the new posture. */ + if (new_posture == TX_INT_ENABLE) + { + + /* Clear the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_win32_int_disabled_flag = TX_FALSE; + + /* Determine if the critical section is locked. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + } + else if (new_posture == TX_INT_DISABLE) + { + + /* Set the disabled flag. */ + _tx_thread_current_ptr -> tx_thread_win32_int_disabled_flag = TX_TRUE; + } + } + + /* Return the previous interrupt disable posture. */ + return(old_posture); +} + diff --git a/ports/win32/vs_2019/src/tx_thread_schedule.c b/ports/win32/vs_2019/src/tx_thread_schedule.c new file mode 100644 index 00000000..5b8a756d --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_schedule.c @@ -0,0 +1,291 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_schedule Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function waits for a thread control block pointer to appear in */ +/* the _tx_thread_execute_ptr variable. Once a thread pointer appears */ +/* in the variable, the corresponding thread is resumed. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* ReleaseSemaphore Win32 release semaphore */ +/* ResumeThread Win32 resume thread */ +/* Sleep Win32 thread sleep */ +/* WaitForSingleObject Win32 wait on a semaphore */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_initialize_kernel_enter ThreadX entry function */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_schedule(VOID) +{ + + + /* Loop forever. */ + while(1) + { + + /* Wait for a thread to execute and all ISRs to complete. */ + while(1) + { + + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-wake_up", __FILE__, __LINE__); + + /* Determine if there is a thread ready to execute AND all ISRs + are complete. */ + if ((_tx_thread_execute_ptr != TX_NULL) && (_tx_thread_system_state == 0)) + { + + /* Get out of this loop and schedule the thread! */ + break; + } + else + { + + /* Leave the critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); + + /* Now sleep so we don't block forever. */ + Sleep(2); + } + } + + /* Yes! We have a thread to execute. Note that the critical section is already + active from the scheduling loop above. */ + + /* Setup the current thread pointer. */ + _tx_thread_current_ptr = _tx_thread_execute_ptr; + + /* Increment the run count for this thread. */ + _tx_thread_current_ptr -> tx_thread_run_count++; + + /* Setup time-slice, if present. */ + _tx_timer_time_slice = _tx_thread_current_ptr -> tx_thread_time_slice; + + /* Determine how the thread was suspended. */ + if (_tx_thread_current_ptr -> tx_thread_win32_suspension_type) + { + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-resume_thread", __FILE__, __LINE__); + + /* Pseudo interrupt suspension. The thread is not waiting on + its run semaphore. */ + ResumeThread(_tx_thread_current_ptr -> tx_thread_win32_thread_handle); + } + else + { + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-release_sem", __FILE__, __LINE__); + + /* Let the thread run again by releasing its run semaphore. */ + ReleaseSemaphore(_tx_thread_current_ptr -> tx_thread_win32_thread_run_semaphore, 1, NULL); + } + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SCHEDULE-self_suspend_sem", __FILE__, __LINE__); + + /* Exit Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); + + /* Now suspend the main thread so the application thread can run. */ + WaitForSingleObject(_tx_win32_scheduler_semaphore, INFINITE); + } +} + + +/* Define the ThreadX Win32 critical section get, release, and release all functions. */ + +void _tx_win32_critical_section_obtain(TX_WIN32_CRITICAL_SECTION *critical_section) +{ + +TX_THREAD *thread_ptr; + + + /* Is the protection owned? */ + if (critical_section -> tx_win32_critical_section_owner == GetCurrentThreadId()) + { + + /* Simply increment the nested counter. */ + critical_section -> tx_win32_critical_section_nested_count++; + } + else + { + + /* Pickup the current thread pointer. */ + thread_ptr = _tx_thread_current_ptr; + + /* Get the Win32 critical section. */ + while (WaitForSingleObject(critical_section -> tx_win32_critical_section_mutex_handle, 3) != WAIT_OBJECT_0) + { + } + + /* At this point we have the mutex. */ + + /* Increment the nesting counter. */ + critical_section -> tx_win32_critical_section_nested_count = 1; + + /* Remember the owner. */ + critical_section -> tx_win32_critical_section_owner = GetCurrentThreadId(); + } +} + + +void _tx_win32_critical_section_release(TX_WIN32_CRITICAL_SECTION *critical_section) +{ + + + /* Ensure the caller is the mutex owner. */ + if (critical_section -> tx_win32_critical_section_owner == GetCurrentThreadId()) + { + + /* Determine if there is protection. */ + if (critical_section -> tx_win32_critical_section_nested_count) + { + + /* Decrement the nesting counter. */ + critical_section -> tx_win32_critical_section_nested_count--; + + /* Determine if the critical section is now being released. */ + if (critical_section -> tx_win32_critical_section_nested_count == 0) + { + + /* Yes, it is being released clear the owner. */ + critical_section -> tx_win32_critical_section_owner = 0; + + /* Finally, release the mutex. */ + if (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) != TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + + /* Just in case, make sure there the mutex is not owned. */ + while (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) == TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + + /* Sleep for 0, just to relinquish to other ready threads. */ + Sleep(0); + } + } + } + else + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } +} + + +void _tx_win32_critical_section_release_all(TX_WIN32_CRITICAL_SECTION *critical_section) +{ + + /* Ensure the caller is the mutex owner. */ + if (critical_section -> tx_win32_critical_section_owner == GetCurrentThreadId()) + { + + /* Determine if there is protection. */ + if (critical_section -> tx_win32_critical_section_nested_count) + { + + /* Clear the nesting counter. */ + critical_section -> tx_win32_critical_section_nested_count = 0; + + /* Yes, it is being release clear the owner. */ + critical_section -> tx_win32_critical_section_owner = 0; + + /* Finally, release the mutex. */ + if (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) != TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + + /* Just in case, make sure there the mutex is not owned. */ + while (ReleaseMutex(critical_section -> tx_win32_critical_section_mutex_handle) == TX_TRUE) + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } + } + } + else + { + + /* Increment the system error counter. */ + _tx_win32_system_error++; + } +} + diff --git a/ports/win32/vs_2019/src/tx_thread_stack_build.c b/ports/win32/vs_2019/src/tx_thread_stack_build.c new file mode 100644 index 00000000..649a9066 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_stack_build.c @@ -0,0 +1,157 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include + + +/* Prototype for new thread entry function. */ + +DWORD WINAPI _tx_win32_thread_entry(LPVOID p); + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_stack_build Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function builds a stack frame on the supplied thread's stack. */ +/* The stack frame results in a fake interrupt return to the supplied */ +/* function pointer. */ +/* */ +/* INPUT */ +/* */ +/* thread_ptr Pointer to thread control blk */ +/* function_ptr Pointer to return function */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* CreateThread Win32 create thread */ +/* ResumeThread Win32 resume thread */ +/* SetThreadPriority Win32 set thread priority */ +/* */ +/* CALLED BY */ +/* */ +/* _tx_thread_create Create thread service */ +/* _tx_thread_reset Reset thread service */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_stack_build(TX_THREAD *thread_ptr, VOID (*function_ptr)(VOID)) +{ + + /* Create a Win32 thread for the application thread. */ + thread_ptr -> tx_thread_win32_thread_handle = + CreateThread(NULL, 0, _tx_win32_thread_entry, (LPVOID) thread_ptr, CREATE_SUSPENDED, + &(thread_ptr -> tx_thread_win32_thread_id)); + + /* Check for a good thread create. */ + if (!thread_ptr -> tx_thread_win32_thread_handle) + { + + /* Display an error message. */ + printf("ThreadX Win32 error creating thread!\n"); + while(1) + { + } + } + + /* Otherwise, we have a good thread create. Now set the priority to + a lower level. */ + SetThreadPriority(thread_ptr -> tx_thread_win32_thread_handle, THREAD_PRIORITY_LOWEST); + + /* Create the run semaphore for the thread. This will allow the scheduler + control over when the thread actually runs. */ + thread_ptr -> tx_thread_win32_thread_run_semaphore = CreateSemaphore(NULL, 0, 1, NULL); + + /* Determine if the run semaphore was created successfully. */ + if (!thread_ptr -> tx_thread_win32_thread_run_semaphore) + { + + /* Display an error message. */ + printf("ThreadX Win32 error creating thread running semaphore!\n"); + while(1) + { + } + } + + /* Setup the thread suspension type to solicited thread suspension. + Pseudo interrupt handlers will suspend with this field set to 1. */ + thread_ptr -> tx_thread_win32_suspension_type = 0; + + /* Clear the disabled count that will keep track of the + tx_interrupt_control nesting. */ + thread_ptr -> tx_thread_win32_int_disabled_flag = 0; + + /* Setup a fake thread stack pointer. */ + thread_ptr -> tx_thread_stack_ptr = (VOID *) (((CHAR *) thread_ptr -> tx_thread_stack_end) - 8); + + /* Clear the first word of the stack. */ + *(((ULONG *) thread_ptr -> tx_thread_stack_ptr) - 1) = 0; + + /* Make the thread initially ready so it will run to the initial wait on + its run semaphore. */ + ResumeThread(thread_ptr -> tx_thread_win32_thread_handle); +} + + +DWORD WINAPI _tx_win32_thread_entry(LPVOID ptr) +{ + +TX_THREAD *thread_ptr; + + /* Pickup the current thread pointer. */ + thread_ptr = (TX_THREAD *) ptr; + + /* Now suspend the thread initially. If the thread has already + been scheduled, this will return immediately. */ + WaitForSingleObject(thread_ptr -> tx_thread_win32_thread_run_semaphore, INFINITE); + + /* Call ThreadX thread entry point. */ + _tx_thread_shell_entry(); + + return EXIT_SUCCESS; +} + diff --git a/ports/win32/vs_2019/src/tx_thread_system_return.c b/ports/win32/vs_2019/src/tx_thread_system_return.c new file mode 100644 index 00000000..921ce850 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_thread_system_return.c @@ -0,0 +1,212 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Thread */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_thread.h" +#include "tx_timer.h" +#include + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_thread_system_return Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function is target processor specific. It is used to transfer */ +/* control from a thread back to the system. Only a minimal context */ +/* is saved since the compiler assumes temp registers are going to get */ +/* slicked by a function call anyway. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* _tx_win32_critical_section_release_all */ +/* Release critical section */ +/* ExitThread Win32 thread exit */ +/* GetCurrentThread Win32 get current thread */ +/* GetCurrentThreadId Win32 get current thread ID */ +/* GetThreadPriority Win32 get thread priority */ +/* ReleaseSemaphore Win32 release semaphore */ +/* WaitForSingleObject Win32 wait on semaphore */ +/* */ +/* CALLED BY */ +/* */ +/* ThreadX components */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_thread_system_return(VOID) +{ + +TX_THREAD *temp_thread_ptr; +HANDLE temp_run_semaphore; +UINT temp_thread_state; +HANDLE threadhandle; +int threadpriority; +DWORD threadid; + + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Pickup the handle of the current thread. */ + threadhandle = GetCurrentThread(); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN", __FILE__, __LINE__); + + /* First, determine if the thread was terminated. */ + + /* Pickup the priority of the current thread. */ + threadpriority = GetThreadPriority(threadhandle); + + /* Pickup the ID of the current thread. */ + threadid = GetCurrentThreadId(); + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread (THREAD_PRIORITY_LOWEST) and it does not + match the current thread pointer. */ + if ((threadpriority == THREAD_PRIORITY_LOWEST) && + ((!temp_thread_ptr) || (temp_thread_ptr -> tx_thread_win32_thread_id != threadid))) + { + + /* This indicates the Win32 thread was actually terminated by ThreadX and is only + being allowed to run in order to cleanup its resources. */ + + /* Release critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* Exit thread. */ + ExitThread(0); + } + + /* Determine if the time-slice is active. */ + if (_tx_timer_time_slice) + { + + /* Preserve current remaining time-slice for the thread and clear the current time-slice. */ + temp_thread_ptr -> tx_thread_time_slice = _tx_timer_time_slice; + _tx_timer_time_slice = 0; + } + + /* Save the run semaphore into a temporary variable as well. */ + temp_run_semaphore = temp_thread_ptr -> tx_thread_win32_thread_run_semaphore; + + /* Pickup the current thread state. */ + temp_thread_state = temp_thread_ptr -> tx_thread_state; + + /* Setup the suspension type for this thread. */ + temp_thread_ptr -> tx_thread_win32_suspension_type = 0; + + /* Set the current thread pointer to NULL. */ + _tx_thread_current_ptr = TX_NULL; + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN-release_sem", __FILE__, __LINE__); + + /* Release the semaphore that the main scheduling thread is waiting + on. Note that the main scheduling algorithm will take care of + setting the current thread pointer to NULL. */ + ReleaseSemaphore(_tx_win32_scheduler_semaphore, 1, NULL); + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* Determine if the thread was self-terminating. */ + if (temp_thread_state == TX_TERMINATED) + { + + /* Exit the thread instead of waiting on the semaphore! */ + ExitThread(0); + } + + /* Wait on the run semaphore for this thread. This won't get set again + until the thread is scheduled. */ + WaitForSingleObject(temp_run_semaphore, INFINITE); + + /* Enter Win32 critical section. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN-wake_up", __FILE__, __LINE__); + + /* Determine if the thread was terminated. */ + + /* Pickup the current thread pointer. */ + temp_thread_ptr = _tx_thread_current_ptr; + + /* Determine if this is a thread (THREAD_PRIORITY_LOWEST) and it does not + match the current thread pointer. */ + if ((threadpriority == THREAD_PRIORITY_LOWEST) && + ((!temp_thread_ptr) || (temp_thread_ptr -> tx_thread_win32_thread_id != threadid))) + { + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release_all(&_tx_win32_critical_section); + + /* This indicates the Win32 thread was actually terminated by ThreadX and is only + being allowed to run in order to cleanup its resources. */ + ExitThread(0); + } + + /* Now determine if the application thread last had interrupts disabled. */ + + /* Debug entry. */ + _tx_win32_debug_entry_insert("SYSTEM_RETURN-finish", __FILE__, __LINE__); + + /* Determine if this thread had interrupts disabled. */ + if (!_tx_thread_current_ptr -> tx_thread_win32_int_disabled_flag) + { + + /* Leave Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); + } +} + diff --git a/ports/win32/vs_2019/src/tx_timer_interrupt.c b/ports/win32/vs_2019/src/tx_timer_interrupt.c new file mode 100644 index 00000000..83edfa34 --- /dev/null +++ b/ports/win32/vs_2019/src/tx_timer_interrupt.c @@ -0,0 +1,153 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) Microsoft Corporation. All rights reserved. */ +/* */ +/* This software is licensed under the Microsoft Software License */ +/* Terms for Microsoft Azure RTOS. Full text of the license can be */ +/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ +/* and in the root directory of this software. */ +/* */ +/**************************************************************************/ + + +/**************************************************************************/ +/**************************************************************************/ +/** */ +/** ThreadX Component */ +/** */ +/** Timer */ +/** */ +/**************************************************************************/ +/**************************************************************************/ + +#define TX_SOURCE_CODE + + +/* Include necessary system files. */ + +#include "tx_api.h" +#include "tx_timer.h" +#include "tx_thread.h" + + +/**************************************************************************/ +/* */ +/* FUNCTION RELEASE */ +/* */ +/* _tx_timer_interrupt Win32/Visual */ +/* 6.0.1 */ +/* AUTHOR */ +/* */ +/* William E. Lamie, Microsoft Corporation */ +/* */ +/* DESCRIPTION */ +/* */ +/* This function processes the hardware timer interrupt. This */ +/* processing includes incrementing the system clock and checking for */ +/* time slice and/or timer expiration. If either is found, the */ +/* interrupt context save/restore functions are called along with the */ +/* expiration functions. */ +/* */ +/* INPUT */ +/* */ +/* None */ +/* */ +/* OUTPUT */ +/* */ +/* None */ +/* */ +/* CALLS */ +/* */ +/* _tx_thread_time_slice Time slice interrupted thread */ +/* _tx_timer_expiration_process Timer expiration processing */ +/* _tx_win32_critical_section_obtain Obtain critical section */ +/* _tx_win32_critical_section_release Release critical section */ +/* */ +/* CALLED BY */ +/* */ +/* interrupt vector */ +/* */ +/* RELEASE HISTORY */ +/* */ +/* DATE NAME DESCRIPTION */ +/* */ +/* 06-30-2020 William E. Lamie Initial Version 6.0.1 */ +/* */ +/**************************************************************************/ +VOID _tx_timer_interrupt(VOID) +{ + + + /* Enter critical section to ensure other threads are not playing with + the core ThreadX data structures. */ + _tx_win32_critical_section_obtain(&_tx_win32_critical_section); + + /* Debug entry. */ + _tx_win32_debug_entry_insert("TIMER INTERRUPT", __FILE__, __LINE__); + + /* Increment the system clock. */ + _tx_timer_system_clock++; + + /* Test for time-slice expiration. */ + if (_tx_timer_time_slice) + { + + /* Decrement the time_slice. */ + _tx_timer_time_slice--; + + /* Check for expiration. */ + if (_tx_timer_time_slice == 0) + { + + /* Set the time-slice expired flag. */ + _tx_timer_expired_time_slice = TX_TRUE; + } + } + + /* Test for timer expiration. */ + if (*_tx_timer_current_ptr) + { + + /* Set expiration flag. */ + _tx_timer_expired = TX_TRUE; + } + else + { + + /* No timer expired, increment the timer pointer. */ + _tx_timer_current_ptr++; + + /* Check for wrap-around. */ + if (_tx_timer_current_ptr == _tx_timer_list_end) + { + + /* Wrap to beginning of list. */ + _tx_timer_current_ptr = _tx_timer_list_start; + } + } + + /* See if anything has expired. */ + if ((_tx_timer_expired_time_slice) || (_tx_timer_expired)) + { + + /* Did a timer expire? */ + if (_tx_timer_expired) + { + + /* Process timer expiration. */ + _tx_timer_expiration_process(); + } + + /* Did time slice expire? */ + if (_tx_timer_expired_time_slice) + { + + /* Time slice interrupted thread. */ + _tx_thread_time_slice(); + } + } + + /* Exit Win32 critical section. */ + _tx_win32_critical_section_release(&_tx_win32_critical_section); +} +